CreateFileMapping和OpenFileMapping不在不同的进程中协作

Max*_*Max 2 c++ winapi shared-memory

我正在尝试使用CreateFileMapping和OpenFileMapping在进程之间共享内存.这不是我想要的 - OpenFileMapping返回null而GetLastError是5 - 访问被拒绝.我有什么想法我做错了吗?名称就像MemoryTest.

编辑:

使用CreateFileMapping两次我都可以读取在其他进程中写入的数据.这是一个问题的原因是我得到错误183 - 内存区已经存在.但是,它仍然返回现有内存的句柄.

var map_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(int), name.c_str());

....

var handle = MapViewOfFile(map_handle, FILE_MAP_ALL_ACCESS , 0, 0, 0)

*handle = 10;

UnMapViewOfFile(map_handle);

getchar();
Run Code Online (Sandbox Code Playgroud)

其他过程:

var map_handle = OpenFileMapping(PAGE_READWRITE, false, name.c_str())

....

var handle = MapViewOfFile(map_handle, FILE_MAP_ALL_ACCESS , 0, 0, 0) //returns null

var out = *handle;

getchar();
Run Code Online (Sandbox Code Playgroud)

这适用于第二个过程:

var map_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(int), name.c_str());

....

var handle = MapViewOfFile(map_handle, FILE_MAP_ALL_ACCESS , 0, 0, 0) //returns null

var out = *handle;

getchar();
Run Code Online (Sandbox Code Playgroud)

Rom*_* R. 8

从一开始就要注意的简单事项:

  • 错误代码5:ERROR_ACCESS_DENIED"访问被拒绝."
  • 错误代码183:ERROR_ALREADY_EXISTS"当该文件已存在时无法创建文件."

ERROR_ALREADY_EXISTS是一个记录在案的行为,它表示您确实收到句柄,但它是已存在的对象的句柄,而不是已创建的句柄.

不工作的问题OpenFileMapping在于它的第一个参数:API函数需要来自另一个枚举的值/标志,它需要FILE_MAP_*值而不是PAGE_*.参数不正确导致无法打开所需的映射.