zoukankan      html  css  js  c++  java
  • 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"));

  • 相关阅读:
    分享一个js方法
    微信小程序中如何使用setData修改数组或对象中的某一参数
    微信小程序实现图片上传功能
    微信小程序图片上传放大预览删除代码
    小程序单张图片 和 九宫格图片上传、预览、删除示例
    微信小程序多图上传/朋友圈传图效果【附完整源码】
    shell 和awk性能对比
    超实用的8个Linux命令行性能监测工具
    storm分组模式
    Python程序的执行原理(转)
  • 原文地址:https://www.cnblogs.com/elonlee/p/3621541.html
Copyright © 2011-2022 走看看