系统错误0x5:CreateFileMapping()

Bun*_*ori 11 c++ windows winapi memory-mapped-files windows-7

我希望使用命名共享内存来实现IPC.

为此,其中一个步骤是使用CreateFileMapping()获取映射内存对象的句柄.

我完全按照MSDN网站的说法做到:http://msdn.microsoft.com/en-us/library/aa366551( v = VS.85).aspx:

hFileMappingHandle = 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)  
        "Global\\MyFileMappingObject"          // name of mapping object
    ); 
DWORD dwError = GetLastError();
Run Code Online (Sandbox Code Playgroud)

但是,返回的句柄始终为0x0,并且返回的系统错误代码为:0x5(拒绝访问.)

  • 仅需要命名的内存共享(不是文件共享).
  • Windows 7 x64位操作系统
  • 管理员的用户权限可用
  • 开发应用程序:64位插件应用程序(.dll)

有没有人有同样的经历,还有一种解决方法吗?我使用MSDN网站作为我的参考,所以我不认为,代码中存在问题.

Eug*_*its 11

看起来你没有足够的权限.

来自MSDN:

从会话零以外的会话在全局命名空间中创建文件映射对象需要SeCreateGlobalPrivilege特权.有关更多信息,请参阅内核对象命名空间.

...

通过使用CreateFileMapping从会话零以外的会话中在全局命名空间中创建文件映射对象是特权操作.因此,在任意远程桌面会话主机(RD会话主机)服务器会话中运行的应用程序必须启用SeCreateGlobalPrivilege才能成功在全局命名空间中创建文件映射对象.权限检查仅限于创建文件映射对象,不适用于打开现有对象.例如,如果服务或系统创建文件映射对象,则任何会话中运行的任何进程都可以访问该文件映射对象,前提是该用户具有必要的访问权限.

  • 嗨尤金,这正是我的问题.我从映射对象的名称中删除了前缀"Global \\",并且显然修复了问题.我不打算处理终端服务,因此解决方案现在应该可以接受.我阅读了关于SeCreateGlobalPriviledge的文档,但我不清楚,如果应用程序本身可以分配权限,还是我必须在Windows资源管理器中手动调整权限? (3认同)