【发布时间】:2012-05-09 18:08:34
【问题描述】:
我目前正在尝试使用文件映射来测试进程间通信。我将调用生产者的第一个程序在以下创建文件映射并写入它的代码上不会出错,如下所示:
hEvent = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
256, // maximum object size (low-order DWORD)
TEXT("hEvent"));
if (hEvent == NULL)
{
MessageBox(NULL, TEXT("error: cannot create file map"), TEXT("gotit"), MB_OK);
_tprintf(TEXT("Could not create file mapping object (%d).\n"),
GetLastError());
return 1;
}
mapBuffer = (LPTSTR) MapViewOfFile(hEvent, FILE_MAP_ALL_ACCESS, NULL, NULL, 256);
if (mapBuffer == NULL)
{
MessageBox(NULL, TEXT("error: cannot view map"), TEXT("gotit"), MB_OK);
_tprintf(TEXT("Could not map view of file (%d).\n"),
GetLastError());
CloseHandle(hEvent);
return 1;
}
CopyMemory((PVOID)mapBuffer, teststring, 256);
_getch();
UnmapViewOfFile(mapBuffer);
CloseHandle(hEvent);
但是,我的第二个程序模仿第二个进程,我将命名消费者,在尝试使用以下代码重新打开此文件映射时出错:
hEvent = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, TEXT("hEvent"));
if (hEvent == NULL)
{
MessageBox(NULL, TEXT("error opening filemap"), TEXT("gotit"), MB_OK);
GetLastError();
return 1;
}
谁能看出我遗漏了什么明显的东西?
【问题讨论】:
-
将您的映射对象命名为独特的名称,以防万一其他软件也使用命名文件映射。
-
哈哈,真是个愚蠢的错误。事实证明,在第二个进程获得它之前,我在第一个进程中结束了句柄。关闭句柄(hEvent);我把它从第一个过程中取出,它停止了第二个错误。
-
另外,这两个程序是否由同一用户运行?在相同的隔离级别?
-
他们都在同一台计算机上,在不同的 visStud 项目中。我想我已经解决了这个问题,现在只是为了让它正确读取我在两者之间传递的字符串。
-
我认为复制句柄比使用命名对象更安全。在 windows 中如何命名命名对象没有规则。
标签: c++ c winapi file-mapping