gpt4 book ai didi

c - 使用 CreateFileMapping 时出错 - C

转载 作者:太空宇宙 更新时间:2023-11-04 00:33:33 26 4
gpt4 key购买 nike

我正在使用 this MSDN link 上的教程实现一种将数据从一个进程传输到另一个进程的方法。尽管有人建议我 earlier question要使用 Pipe 方法,由于某些限制,我别无选择,只能使用 CreateFileMapping 方法。

现在,我已经成功地在同一个解决方案中制作了两个单独的窗口窗体项目,并通过编辑两个窗体同时加载的一些属性。

此外,我已经设法将 MSDN 示例中给出的代码实现到第一个(生产者)和第二个(消费者)程序中,没有任何编译错误。

我现在遇到的问题是,当我运行第一个程序并尝试创建映射文件的句柄时,我得到一个错误,说它不成功,我不明白为什么会这样。

我已经添加了生产者和消费者代码文件来演示我正在尝试做什么。

制作人:

#include <windows.h>
#include <stdio.h>
#include <conio.h>


//File header definitions
#define IDM_FILE_ROLLDICE 1
#define IDM_FILE_QUIT 2
#define BUF_SIZE 256

TCHAR szName[]=TEXT("Global\\MyFileMappingObject");
TCHAR szMsg[]=TEXT("Message from first process!");

void AddMenus(HWND);
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);

////Standard windows stuff - omitted to save space.

//////////////////////
// WINDOWS FUNCTION //
//////////////////////
LRESULT CALLBACK WindowFunc(HWND hMainWindow, UINT message,
WPARAM wParam, LPARAM lParam)
{
WCHAR buffer[256];
LPCTSTR pBuf;

struct DiceData storage;
HANDLE hMapFile;

switch(message)
{
case WM_CREATE:
{

// Create Menus
AddMenus(hMainWindow);
}

break;
case WM_COMMAND:
// Intercept menu choices
switch(LOWORD(wParam))
{
case IDM_FILE_ROLLDICE:
{
//Roll dice and store results in variable
//storage = RollDice();

////Copy results to buffer
//swprintf(buffer,255,L"Dice 1: %d, Dice 2: %d",storage.dice1,storage.dice2);

////Show via message box
//MessageBox(hMainWindow,buffer,L"Dice Result",MB_OK);

hMapFile = CreateFileMapping(
(HANDLE)0xFFFFFFFF, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
BUF_SIZE, // maximum object size (low-order DWORD)
szName); // name of mapping object

if (hMapFile == NULL)
{
MessageBox(hMainWindow,L"Could not create file mapping object",L"Error",NULL);
return 1;
}
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);

if (pBuf == NULL)
{
MessageBox(hMainWindow,L"Could not map view of file",L"Error",NULL);

CloseHandle(hMapFile);

return 1;
}


CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
_getch();

UnmapViewOfFile(pBuf);

CloseHandle(hMapFile);

}
break;

case IDM_FILE_QUIT:
SendMessage(hMainWindow, WM_CLOSE, 0, 0);
break;
}
break;

case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hMainWindow, message, wParam, lParam);
}

//
//Setup menus
//

消费者:

#include <windows.h>
#include <stdio.h>
#include <conio.h>

//File header definitions
#define IDM_FILE_QUIT 1
#define IDM_FILE_POLL 2

#define BUF_SIZE 256
TCHAR szName[]=TEXT("Global\\MyFileMappingObject");


//Prototypes
void AddMenus(HWND);
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);

//More standard windows creation, again omitted.

//////////////////////
// WINDOWS FUNCTION //
//////////////////////
LRESULT CALLBACK WindowFunc(HWND hMainWindow, UINT message,
WPARAM wParam, LPARAM lParam)
{


HANDLE hMapFile;
LPCTSTR pBuf;

switch(message)
{
case WM_CREATE:
{

// Create Menus
AddMenus(hMainWindow);
break;
}

case WM_COMMAND:
{
// Intercept menu choices
switch(LOWORD(wParam))
{
case IDM_FILE_POLL:
{
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
szName); // name of mapping object

if (hMapFile == NULL)
{
MessageBox(hMainWindow,L"Could not open file mapping object",L"Error",NULL);
return 1;
}

pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);

if (pBuf == NULL)
{
MessageBox(hMainWindow,L"Could not map view of file",L"Error",NULL);

CloseHandle(hMapFile);

return 1;
}

MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);

UnmapViewOfFile(pBuf);

CloseHandle(hMapFile);

break;
}




case IDM_FILE_QUIT:
SendMessage(hMainWindow, WM_CLOSE, 0, 0);
break;
}
break;
}

case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
}
return DefWindowProc(hMainWindow, message, wParam, lParam);
}

//
//Setup menus
//

这绝不是整洁和最终的,但这只是一个开始,感谢您的帮助。

编辑:错误

Error Image

Edit2:输出

Output Image

最佳答案

你的制作人代码对我有用。您使用的是什么版本的 Windows?在较新的版本(如 Vista 和 7)中,对访问共享内存有额外的安全限制。在您上面引用的 MSDN 文章中有关于此的注释,说您必须是管理员才能在 Windows Vista/7 中创建全局共享内存对象。

您还应该调用 GetLastError() 以查看从 CreateFileMapping() 实际返回的错误代码,这可能有助于确定问题的根本原因。

关于c - 使用 CreateFileMapping 时出错 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2647051/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com