系统错误0x5:CreateFileMapping()

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

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

我完全按照MSDN网站的build议来做: http : //msdn.microsoft.com/zh-cn/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(); 

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

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

有没有人有相同的经验,并有一个方法来解决它,请? 我使用MSDN网站作为我的参考,所以我不认为,在代码中存在问题。

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

来自MSDN:

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

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

管理员,服务和网络服务默认具有SeCreateGlobalPrivilege。 你必须记住,Windows7 / Vista不能像管理员那样运行所有的东西。 因此,使用“以管理员身份启动”使“Global”适用于您的应用程序。 如果您正在调试,也可以以管理员身份启动Visual Studio。

要创建全局文件映射,您需要SeCreateGlobalPrivilege权限 – 你有吗? 拒绝访问意味着这是一个权限问题,当然。

有关全局名称空间的文档中对终端服务的引用有点让人误解,因为这意味着如果出现异常情况,您只需要担心这一点。

事实上,IIS和系统服务都在会话零时运行,并且第一个/唯一登录的用户在会话1中运行 – 所以必须使用全局命名空间来在IIS或服务与普通程序之间进行通信。