C++ 32位和64位进程之间共享的MapViewOfFile
我试图在64位进程中对已映射到另一个32位进程内存的文件使用MapViewOfFile。它失败并给我一个“拒绝访问”错误。这是已知的Windows限制还是我做错了什么?同样的代码适用于2个32位进程 代码有点像这样:C++ 32位和64位进程之间共享的MapViewOfFile,c++,windows,64-bit,32bit-64bit,memory-mapped-files,C++,Windows,64 Bit,32bit 64bit,Memory Mapped Files,我试图在64位进程中对已映射到另一个32位进程内存的文件使用MapViewOfFile。它失败并给我一个“拒绝访问”错误。这是已知的Windows限制还是我做错了什么?同样的代码适用于2个32位进程 代码有点像这样: hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szShmName); if (NULL == hMapFile) { /* failed to open - create new (this happens in
hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szShmName);
if (NULL == hMapFile)
{ /* failed to open - create new (this happens in the 32 bit app) */
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = FALSE;
/* give access to members of administrators group */
BOOL success = ConvertStringSecurityDescriptorToSecurityDescriptor(
"D:(A;OICI;GA;;;BA)",
SDDL_REVISION_1,
&(sa.lpSecurityDescriptor),
NULL);
HANDLE hShmFile = CreateFile(FILE_XXX_SHM,
FILE_ALL_ACCESS, 0,
&sa,
OPEN_ALWAYS, 0, NULL);
hMapFile = CreateFileMapping(hShmFile, &sa, PAGE_READWRITE,
0,
SHM_SIZE,
szShmName);
CloseHandle(hShmFile);
}
// this one fails in 64 bit app
pShm = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, SHM_SIZE);
当您在32位应用程序中调用CreateFile时,您正在为sharing参数传递
0
,这意味着不允许共享。将其更改为FILE\u SHARE\u READ | FILE\u SHARE\u WRITE
可能是正确的一步
编辑:我刚刚制作了一个演示(至少对我来说):
#包括
#包括
静态常量char map_name[]=“FileMapping1”;
静态常量char event1_name[]=“EventName1”;
静态常量char event2_name[]=“EventName2”;
int main(){
HANDLE mapping=OpenFileMapping(FILE\u MAP\u ALL\u ACCESS,FALSE,MAP\u name);
if(NULL==映射){
std::你能检查路径是否被重定向到VirtualStore目录吗?Process Monitor可能会有所帮助。谢谢Jerry,它对你有用很有趣。不过我不认为这是我的问题,因为no sharing标志只传递给CreateFile;该文件会立即关闭,因此不应该应用。而且它在r在多个32位应用程序之间共享,仅当其中一个应用程序为64位时才会出现故障。不过,我会尝试运行您的代码。我想我已经找到了答案。文件大小是根据结构的大小确定的,在64位系统上,结构的大小更大,因为时间是64位的,而在32位版本上,我们强制我们的时间仍然是32位的。对于some指定大于MapViewOfFile上现有区域大小的原因失败,访问被拒绝。谢谢!
#include <windows.h>
#include <iostream>
static const char map_name[] = "FileMapping1";
static const char event1_name[] = "EventName1";
static const char event2_name[] = "EventName2";
int main() {
HANDLE mapping = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, map_name);
if (NULL == mapping) {
std::cout << "Calling CreateFile\n";
HANDLE file = CreateFile("MappedFile",
FILE_ALL_ACCESS,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
0,
NULL);
std::cout << "Creating File mapping\n";
mapping = CreateFileMapping(file, NULL, PAGE_READWRITE, 0, 65536, map_name);
std::cout << "Closing file handle\n";
CloseHandle(file);
}
std::cout << "Mapping view of file\n";
char *memory = (char *)MapViewOfFile(mapping, FILE_MAP_ALL_ACCESS, 0, 0, 65536);
if (memory == NULL) {
std::cerr << "Mapping Failed.\n";
return 1;
}
std::cout << "Mapping succeeded\n";
HANDLE event = CreateEvent(NULL, false, false, event1_name);
if (GetLastError()==ERROR_ALREADY_EXISTS) {
std::cout <<"Waiting to receive string:\n";
WaitForSingleObject(event, INFINITE);
std::cout << "Received: " << memory;
HANDLE event2 = CreateEvent(NULL, false, false, event2_name);
SetEvent(event2);
}
else {
char string[] = "This is the shared string";
std::cout << "Sending string: " << string << "\n";
strncpy(memory, string, sizeof(string));
SetEvent(event);
HANDLE event2 = CreateEvent(NULL, false, false, event2_name);
WaitForSingleObject(event2, INFINITE);
}
return 0;
}