关于映射文件的问题(20分)

  • 主题发起人 主题发起人 kittycat
  • 开始时间 开始时间
K

kittycat

Unregistered / Unconfirmed
GUEST, unregistred user!
type
Tmapinfo=record
info1:integer;
info2:string[255];
end;
var mapinfo:Tmapinfo

procedure TForm1.Button1Click(Sender: TObject);
var
hmap:=Thandle;
pinfo:point;
begin
mapinfo.info1:=1;
mapinfo.info2:='abc';
hMap := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE or SEC_COMMIT,
0, MapSize, 'mapfilename');
pinfo:=mapviewoffile(hMap,FILE_MAP_ALL_ACCESS,0,0,MapSize);

end;

建立“映射文件”之后,如何在另外一个程序中写入mapinfo(若写入的数据已经在文件中,则提示错误!)
,如何取得“映射文件”里面的最后一笔数据?谢谢大家!
 
两个程序各自共享打开映射文件.
想判断是否写入,你尝试读取一次,不过这种方法不保险,比较保险的是在映射文件头(或是另一个映射文件)留一小段空间作为标记位,来标记是否有数据.
取最后一笔数据道理一样,把最后笔数据的位置保存在开头(或是另一个映射文件)的固定位置上.先读取位置,再读数据.
 
能举个例子么,怎样往里面写数据和读数据。对这种“映射文件”的处理,我现在还是一头雾水:)
 
映射文件,说白了就是把一个文件当成一个内存空间来使用,而数据的在内存和硬盘之间的调度是由系统来完成的,系统会根据数据的使用情况来决定数据是否保留在内存.
映射文件一个作用就是这个了,把文件当内存,高效使用内存.
另一个常见的作用就是两个进程之间交换数据.
比如你打开了两个映射文件 指针分别为P1,P2
Pinteger(P1)^:=i;这样就把i写到 文件的第一个四字节中去了.
Pinteger(PChar(P1)+Sizeof(integer)*i)^:=j;这样就是把 j写到 文件偏移Sizeof(integer)*i的位置中去了.
你就把P1当成内存指针那样使用就行了.
 
好的,您的这段话我看明白了,请问是否有两种情况来建立“映像文件”,一种是将硬盘上的文件和内存对应起来;另外一种是直接在内存中生成“共享文件”,并不和硬盘上的某个文件对应,我们所作的操作也都是针对内存的。
 
你理解错了
上面两个特点都是映射文件的特点.因为人们利用它的原因各不同.
有的人想用它的内存作用,有的人只是利用它来交换数据.当然两者都用的也有.

使用了映射文件之后,文件即内存,内存即文件.文件相当于一个内存块.
映射 就是把文件和内存相映射,就这个意思.
 
非常感谢!
我现在遇到的问题是这样的:原来程序A在内存中读出数据后在硬盘上面保存文件,程序B从硬盘文件中读数据之后再进行其他操作!
我想把他们之间的通讯方式改成“内存共享”,那我该如何做呢?
1.程序A在内存读出数据保存为硬盘文件之后再做“映射文件”,程序B读取“映射文件”中的内容
2.程序A在内存读出数据之后并不在硬盘生成文件,而是直接做“映射文件”,程序B读取“映射文件”中的内容
请问,我应采取哪个方案,谢谢!
 
2 方案好些
就是利用映射文件做进程间的数据交换
A和B都共享写读映射同一个文件,A在写,B在读就行了.相当于两个进程在读写同一个内存块一样.
 
我现在的系统是已经生成了硬盘文件,直接采用方案1会不会比方案2简单一点(我是指改动代码要少一点)
 
我晕
内存映射文件本来就是须要一个硬盘文件的呀.
 
谢谢:)我又发了几个关于文件映射的问题,你有空再帮我看看:)
 

Similar threads

后退
顶部