elvis blogs

日子过得很有意义,我们产出了很多,也消费了很多!在这个过程中,我们汲取了养份和能量又即将发挥在不久的将来!我们努力着,拼博着并快乐着!

导航

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

  通常使用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"));

 

posted on 2011-11-03 16:45  elvis blogs  阅读(5258)  评论(0编辑  收藏  举报