Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用户进程可以';看不到服务创建的全局共享内存_C++_Windows_Security_Winapi_Memory Mapped Files - Fatal编程技术网

C++ 用户进程可以';看不到服务创建的全局共享内存

C++ 用户进程可以';看不到服务创建的全局共享内存,c++,windows,security,winapi,memory-mapped-files,C++,Windows,Security,Winapi,Memory Mapped Files,我有一个Windows服务(在系统进程中运行)和一个需要共享配置结构的桌面应用程序。数据源于应用程序,但用户进程没有创建全局内存对象的权限,因此我在服务启动时使用CreateFileMapping()和基于的DACL创建它。这似乎工作正常:我从CreateFileMapping()返回了一个非空句柄,GetLastError()为0。问题是,应用程序看不到对象——OpenFileMapping()返回一个空句柄,错误为\u FILE\u NOT\u FOUND——如果我用WinObj手动浏览全局

我有一个Windows服务(在系统进程中运行)和一个需要共享配置结构的桌面应用程序。数据源于应用程序,但用户进程没有创建全局内存对象的权限,因此我在服务启动时使用CreateFileMapping()和基于的DACL创建它。这似乎工作正常:我从CreateFileMapping()返回了一个非空句柄,GetLastError()为0。问题是,应用程序看不到对象——OpenFileMapping()返回一个空句柄,错误为\u FILE\u NOT\u FOUND——如果我用WinObj手动浏览全局对象,我也看不到它。是什么使我的物体不可见

SECURITY_ATTRIBUTES security;
ZeroMemory(&security, sizeof(security));
security.nLength = sizeof(security);
ConvertStringSecurityDescriptorToSecurityDescriptor(
    "D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GWGR;;;IU)",
    SDDL_REVISION_1,
    &security.lpSecurityDescriptor,
    NULL);
HANDLE  hFile = CreateFileMapping(INVALID_HANDLE_VALUE, &security, PAGE_READWRITE, 0, 1024*4, "Global\\gCONFIGXFILE");
DWORD   fileMappingResult = GetLastError();
if (hFile)
{
    CloseHandle(hFile);
}
LocalFree(security.lpSecurityDescriptor);

您的服务在创建文件映射后立即关闭其句柄,因此映射在应用程序有机会打开其句柄之前被销毁。您的服务需要将其映射句柄保持打开状态,至少在应用程序打开其映射句柄之后


由于您正在共享配置,您可能应该在服务启动时创建映射,并将其保持打开状态,直到服务停止。您可以通过
CreateEvent()
使用一个命名事件,让服务告诉应用程序何时实际创建了映射,也可以在任何一个进程更改映射内容时使用另一个命名事件。

我没有意识到这会自动发生;我想我必须删除句柄。谢谢从某种意义上说,关闭句柄就是删除。许多内核对象都是引用计数的,包括文件映射。创建映射时,其引用计数为1。关闭句柄时,其引用计数将递减。当引用计数达到零时,将释放映射。这就是为什么应用程序需要在服务关闭其句柄之前打开其映射句柄,以便引用计数不会过早降至零。文件映射可能不是您想要的。您可能需要某种形式的IPC消息传递。