问题是这样子的
两个程序 A 和 BA: 是一个系统服务程序  随系统启动而运行
创建了一个内存映像
  hmapping := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
    SizeOf(MyData),
    PChar('ShareMem')); B:是一个普通应用程序 
在用openfilemapping 定位到内存映像时出错,我查了错误代码是: 拒绝访问  MapHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, False,
    PChar('ShareMemMap'));问问诸位高手如何解决呢?

解决方案 »

  1.   

    你名字写错了吧
    MapHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, False,
      PChar('ShareMem'));
      

  2.   

    如果是权限问题的话,可以修改成var
      hFileMapping: THandle;
      sa: SECURITY_ATTRIBUTES;
      sd: SECURITY_DESCRIPTOR;begin
        hFileMapping := OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, PChar('MyShareMem'));
        if hFileMapping = 0 then
        begin
          // 设置权限
          InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
          SetSecurityDescriptorDacl(@sd, TRUE, nil, FALSE);
          FillChar(sa, sizeof(SECURITY_ATTRIBUTES), 0);
          sa.bInheritHandle := FALSE;
          sa.lpSecurityDescriptor := @sd;
          sa.nLength := sizeof(SECURITY_ATTRIBUTES);      hFileMapping := CreateFileMapping(INVALID_HANDLE_VALUE, @sa, PAGE_READWRITE or SEC_COMMIT, 0, FSize, PChar(MyShareMem));
        end;
    end;
      

  3.   

    TO cgfhz:
    名字没错~我打字打错了~
    GetLastError返回值是:5  拒绝访问
    都是在admin账户下编译的
      

  4.   

    CreateFileMapping() 之前先设置权限,用上面的代码试试
      

  5.   

    服务是以system帐号运行的,普通应用程序是登录的帐号运行的。不能共享内存,想别的办法吧。
      

  6.   

    const MAPNAME = 'Global\MYMap.MAP';...
    procedure TFileMap.OpenMap;
    var
      sa: SECURITY_ATTRIBUTES;
      sd: SECURITY_DESCRIPTOR;
    begin
      if (FMapHandle = 0) and (FMapPointer = nil) then
      begin
        FExistsAlready := False;    InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
        SetSecurityDescriptorDacl(@sd, True, nil, False);
        sa.nLength := sizeof(SECURITY_ATTRIBUTES);
        sa.bInheritHandle := True;
        sa.lpSecurityDescriptor := @sd;
        FMapHandle := CreateFileMapping(INVALID_HANDLE_VALUE, @sa, PAGE_READWRITE, 0, FSize, PChar(MAPNAME));
        if (FMapHandle = INVALID_HANDLE_VALUE) or (FMapHandle = 0) then exit;
        if (FMapHandle <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
          FExistsAlready := True; //如果已经建立的话,就设它为TRUE;
        FMapPointer := MapViewOfFile(FMapHandle, FILE_MAP_ALL_ACCESS, 0, 0, IE_MAPSIZE);
      end;  FIsMapOpen := True;
    end;1.通过权限控制,可以跨服务、应用程序
    2.在你的应用中,Map名称建议Global\起始,具体说明请见MSDN