我想实施 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();

但是,返回的手柄总是 0x0, ,和 系统错误代码 返回的是: 0x5(访问被拒绝)。

  • 仅有的 命名内存共享 所需的(不文件共享)。
  • Windows 7 X64 位OS
  • 管理员的 可用的用户权利
  • 开发应用程序:64位插件应用程序 (.dll)

请问有人有相同的经验和解决方法吗?我使用MSDN网站作为我的参考,因此我不认为,代码中存在问题。

有帮助吗?

解决方案

看起来您没有足够的特权。

来自MSDN:

从会话零以外的其他会话中创建文件映射对象需要secreateglobalprivilege特权。有关更多信息,请参见内核对象名称空间。

...

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

其他提示

默认情况下,管理员,服务和网络服务具有SecreateGlobalPrivilege。但是您必须记住,Windows7/Vista不会像管理员一样运行所有内容。因此,请使用“启动为管理员”使“全局”适用于您的应用程序。如果您要调试,请启动Visual Studio作为管理员。

要创建全局文件映射,您需要 SeCreateGlobalPrivilege 特权 - 您有吗?当然,被访问的访问意味着这是一个权限问题。

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

实际上,IIS和系统服务都以零会话运行,也是第1次登录运行的第一个 /唯一的用户 - 因此,您必须使用全局名称空间在IIS或Service和Service和正常程序之间进行通信。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top