MSDN中说过,当系统中建立了一个文件的内存映射,那么即使其他程序也对该文件进行映射,那么这些内存映射文件也会保持一致性,就是说,如果我用程序映射A文件,然后在内存中修改它,这个时候,另一个程序也映射了A文件,那么另一个程序得到的内存映射文件一定等于我的程序映射的内存文件(太憋嘴了),但是测试中,我发现并不是这样,我用DELPHI6 / XP,请给我一个列子!

解决方案 »

  1.   

    你是在DLL中创建内存映像文件吗?
      

  2.   

    楼上的能给个列子吗?谢谢!!!我就是想在DLL中有一个全局变量,然后多个程序共享
      

  3.   

    我有例子!
       如果你想的话请告知你的Email.我发给你。
      

  4.   

    我给你个示例
    type
    PTLocalBlackList=^TLocalBlackList;
    TLocalBlackList=record
       dwUserNodeNum:DWORD;
       a_chKeyID:array[0..8] of char;
       a_chDisableDate:array[0..19] of char;
    end;var
       pgLocalBlackList:PTLocalBlackList;
    //打开共享数据
    procedure OpenSharedData;
    var
       i,iSize:Integer;//共享区间大小
    begin   iSize:=SizeOf(TLocalBlackList);
       //创建映射区
       hgLocalBlackList:=CreateFileMapping(DWORD(-1),nil,PAGE_READWRITE,0,iSize,chgLocalBlackList);
       if hgLocalBlackList=0 then begin
          RaiseLastWin32Error;
          exit;
       end;
       //关联映射区
       pgLocalBlackList:=MapViewOfFile(hgLocalBlackList,FILE_MAP_ALL_ACCESS,0,0,iSize);
       if pgLocalBlackList=nil then begin
          CloseHandle(hgLocalBlackList);
          RaiseLastWin32Error;
          exit;
       end;
       pgLocalBlackList^.dwUserNodeNum:=0;
       pgLocalBlackList^.a_chKeyID:='00000000'+#0;
       pgLocalBlackList^.a_chDisableDate:='2002-12-02 10:00:00';
    end;
    //关闭共享数据
    procedure CloseSharedData;
    begin
       UnmapViewOfFile(pgPolItem);
       CloseHandle(hgPolItem);
       UnmapViewOfFile(pgLocalBlackList);
       CloseHandle(hgLocalBlackList);
       UnmapViewOfFile(pgUserNodeInfo);
       CloseHandle(hgUserNodeInfo);
    end;
      

  5.   

    楼上的朋友,感谢你回答,请你看看我的代码:
    var HOOKID:Longint;
        MapHandle:THandle;
        ModifyData:Pointer;
    const cMMFileName='MyBegin';type
    TFunc=function (DllName:string):longint;stdcall;
    var MyFunc:TFunc;procedure OpenShareData;
    var Size:integer;
    begin
    GetMem(ModifyData,255);
     Size:=SizeOf(ModifyData);
     MapHandle:=CreateFileMapping(DWORD(-1),nil,PAGE_READWRITE,0,Size,ModifyData);
     MyFunc:=MapViewOfFile(MapHandle,FILE_MAP_ALL_ACCESS,0,0,Size);
     MyFunc:=ModifyData;//ModifyData是我用另一个过程给传递的值
    end;我感觉我和你写的一样,但是,当我的A程序调用的时候,MyFunc=nil,然后我用A程序给它值,然后再显示结果,一切正常,按道理来说,现在MyFunc已经有实际值了,但是,当我用B程序显示MyFunc的值时,还是MyFunc=nil,由此可见,A程序修改MyFunc的值和B程序显示的值并不是同一个,也可以说映射没有成功,不知道我的推测是否正确,请高手指点,谢谢!