• CreateFileMapping共享内存时添加Global的作用


    来源:http://www.cnblogs.com/elvislogs/articles/ShareMemory.html

     通常使用CreateFileMapping建立共享内存时名称中没有加入"Global\",这使得共享的内存只能在当前用户下被另一个或多个进程访问,例如:

      CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1024, TEXT("MyShare"));

      当把程序放到服务器上并运行,然后用远程桌面连接服务器时的用户身份作为了另一用户,这时运行访问共享内存的程序将产生错误[代码是2]。根据错误代码认为是权限问题,通常会去添加安全描述符,也就是设置CreateFileMapping的LPSECURITY_ATTRIBUTES参数,会这样做:

      SECURITY_DESCRIPTORSECURITY_DESCRIPTOR secutityDese;

      InitializeSecurityDescriptor(&secutityDese, SECURITY_DESCRIPTOR_REVISION);

      SetSecurityDescriptorDacl(&secutityDese,TRUE,NULL,FALSE);

      SECURITY_ATTRIBUTES securityAttr;

      SECURITY_ATTRIBUTESsecurityAttr.nLength = sizeof(SECURITY_ATTRIBUTES);

      securityAttr.bInheritHandle = FALSE;

      securityAttr.lpSecurityDescriptor = &secutityDese;

      CreateFileMapping(INVALID_HANDLE_VALUE, &securityAttr, PAGE_READWRITE | SEC_COMMIT, 0, 1024, TEXT("MyShare"));

      既使我们这样做发现没有任何效果,错误依旧!

      Global\*** 可以保证:在创建命名时间对象时指定名字是全局的,使用全局名称创建的内核对象无论出于服务,还是内核中,应用层都可以打开并使用这个内核对象。

      然后改为使用全局名称,用远程桌面登陆到服务器在不同的用户下就能够运行访问共享内存的程序了!

      CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1024, TEXT("Global\MyShare"));

  • 相关阅读:
    生产者-消费者模型-线程安全队列Queue
    多线程简单案例
    cloudstack 用admin 账号创建虚拟机只是提示insufficient resource
    什么是工厂函数?Python 中工厂函数怎么理解?(转)
    rsync + mysql + gzip + --single-transaction
    Python中获取异常(try Exception)信息
    ansible copy 模块 changed false 没有变化
    _mysql.c:29:20: error: Python.h: No such file or directory
    常用网址
    Android 中常见控件的介绍和使用
  • 原文地址:https://www.cnblogs.com/elonlee/p/3621541.html
Copyright © 2020-2023  润新知