关于内存映射文件保持一致性的问题,高手请进,在线等待!!!

Shikari 2002-12-06 12:47:52
MSDN中说过,当系统中建立了一个文件的内存映射,那么即使其他程序也对该文件进行映射,那么这些内存映射文件也会保持一致性,就是说,如果我用程序映射A文件,然后在内存中修改它,这个时候,另一个程序也映射了A文件,那么另一个程序得到的内存映射文件一定等于我的程序映射的内存文件(太憋嘴了),但是测试中,我发现并不是这样,我用DELPHI6 / XP,请给我一个列子!
...全文
98 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shikari 2002-12-09
  • 打赏
  • 举报
回复
楼上的朋友,感谢你回答,请你看看我的代码:
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程序显示的值并不是同一个,也可以说映射没有成功,不知道我的推测是否正确,请高手指点,谢谢!
uncarman 2002-12-09
  • 打赏
  • 举报
回复
我给你个示例
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;

hot3000 2002-12-06
  • 打赏
  • 举报
回复
我有例子!
如果你想的话请告知你的Email.我发给你。
Shikari 2002-12-06
  • 打赏
  • 举报
回复
楼上的能给个列子吗?谢谢!!!我就是想在DLL中有一个全局变量,然后多个程序共享
stanely 2002-12-06
  • 打赏
  • 举报
回复
两个进程读写同步了么?
Shikari 2002-12-06
  • 打赏
  • 举报
回复
上面的朋友说对了,请指教!!!
Wnyu 2002-12-06
  • 打赏
  • 举报
回复
你是在DLL中创建内存映像文件吗?

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧