我在服务里创建内存映射对象:
m_hShareMem = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 
SHAREMEM_SIZE_HIGH, SHAREMEM_SIZE_LOW, SHARE_MEMOBJ_NAME);然后在我的测试程序里打开:
HANDLE hShareMem = OpenFileMapping(FILE_MAP_WRITE, FALSE, SHARE_MEMOBJ_NAME);
但是总是返回NULL,GetLastError为5(ERROR_ACCESS_DENIED)。
如果把权限设为只读FILE_MAP_READ就可以打开,不知道为什么?

解决方案 »

  1.   

    权限的问题?
    因为服务一般是以LOCAL SYSTEM帐号运行的。
      

  2.   

    多谢codewarrior(会思考的草)几次回答俺的问题,SHARE_MEMOBJ_NAME要加"Global\\",CreateFileMapping的第二个参数应该设置一个,
    SECURITY_ATTRIBUTES   sa;
    .........................
    m_hShareMem  = CreateFileMapping(INVALID_HANDLE_VALUE,&sa,PAGE_READWRITE,SHAREMEM_SIZE_HIGH, SHAREMEM_SIZE_LOW, SHARE_MEMOBJ_NAME);
      

  3.   

    多谢解答,但是还是有问题,我的代码如下:我的创建代码如下:#define SHARE_MEMOBJ_NAME "Global\\REFIENR_{3728909D-412F-4475-8414-2E2710306CF0}"BOOL CService::Initialize()
    {
    if(m_hShareMem != NULL) 
    {
    CloseHandle(m_hShareMem);
    m_hShareMem = NULL;
    }
    TRACE(("Creating share memory")); SECURITY_ATTRIBUTES ScrtyAttr = {0};
    ScrtyAttr.bInheritHandle = FALSE;
    ScrtyAttr.lpSecurityDescriptor = NULL;
    ScrtyAttr.nLength = sizeof(SECURITY_ATTRIBUTES);

    m_hShareMem = CreateFileMapping(INVALID_HANDLE_VALUE, &ScrtyAttr, PAGE_READWRITE, 
    SHAREMEM_SIZE_HIGH, SHAREMEM_SIZE_LOW, SHARE_MEMOBJ_NAME);
    if(m_hShareMem == NULL)
    {
    return FALSE;
    }
    return TRUE;
    }