内存映象文件
使用内存映象文件,当访问磁盘上的文件时,就如同访问内存中的文件一样
以上是我看 d5 开发人员指南一书中的解释,此外还可以用内存映象文件来共享内存的一块区域,使不同的应用程序来读该区域。
共享内存时的 CreateFileMapping
原型
HANDLE CreateFileMapping(
HANDLE hFile,
LPSECURITY_ATTRIBUTES lpAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCTSTR lpName
);
这个 api 的 hFile 必须为 $ffffffff 或 dword(-1)
想法是定义一个 record 记录 , 然后用 createFilemapping 开内存,用 MapViewofFile 来也内存地址
下面是我的一个例子
------------------------------
第一个程序
unit CreateUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
PFileMap = ^TFileMap;
TFileMap = Record
name:string[8];
age:byte;
end;
TForm1 = class(TForm)
WriteM: TButton;
Edit1: TEdit;
CreateM: TButton;
Edit2: TEdit;
CloseM: TButton;
procedure CreateMClick(Sender: TObject);
procedure WriteMClick(Sender: TObject);
procedure CloseMClick(Sender: TObject);
private
FileHandle : THandle;
FileMap : PFileMap;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.CreateMClick(Sender: TObject);
begin
self.FileHandle := createFileMapping($ffffffff,nil,page_readwrite,0,sizeof(TFileMap),
pchar('FileMap'));
if self.FileHandle <> 0 then
begin
self.FileMap:=MapViewOfFile(FileHandle,windows.FILE_MAP_ALL_ACCESS,0,0,sizeof(TfileMap));
if self.FileMap <> nil then
begin
showmessage('成功');
end;
end;
end;
procedure TForm1.WriteMClick(Sender: TObject);
begin
if self.FileMap <> nil then
begin
self.FileMap^.name := edit1.Text;
self.FileMap^.age := strToint(edit2.Text);
end;
end;
procedure TForm1.CloseMClick(Sender: TObject);
begin
if self.FileMap<> nil then
windows.UnmapViewOfFile(self.FileMap);
if self.FileHandle<> 0 then
windows.CloseHandle(self.FileHandle);
end;
end.
------------------------------
第二个程序,读取共享内存中的数据
unit OpenMapUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
PFileMap = ^TFileMap;
TFileMap = Record
name:string[8];
age:byte;
end;
TForm2 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
OpenM: TButton;
MapViewM: TButton;
readM: TButton;
closeM: TButton;
procedure OpenMClick(Sender: TObject);
procedure MapViewMClick(Sender: TObject);
procedure readMClick(Sender: TObject);
procedure closeMClick(Sender: TObject);
private
FileHandle : THandle;
FileMap : PFileMap;
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.OpenMClick(Sender: TObject);
begin
self.FileHandle:= windows.OpenFileMapping(windows.FILE_MAP_ALL_ACCESS,false,pchar('FileMap'));
if self.FileHandle <> 0 then
begin
showmessage('成功');
end;
end;
procedure TForm2.MapViewMClick(Sender: TObject);
begin
//if self.FileHandle <> 0 then
begin
self.FileMap := MapViewOfFile(self.FileHandle,windows.FILE_MAP_ALL_ACCESS
,0,0,sizeof(TFileMap)
);
if self.FileMap <> nil then
begin
showmessage('成功');
end else
showmessage('失败');
end;
end;
procedure TForm2.readMClick(Sender: TObject);
begin
if self.FileMap <> nil then
begin
self.Edit1.Text := FileMap^.name;
self.Edit2.Text := Inttostr(Filemap^.age);
end
else
edit1.Text := '已释放';
end;
procedure TForm2.closeMClick(Sender: TObject);
begin
if self.FileMap<>nil then
begin
showmessage(inttostr(integer(@(self.FileMap)^)));
windows.UnmapViewOfFile(self.FileMap);
showmessage(inttostr(integer(@(self.FileMap)^)));
end;
if self.FileHandle <> 0 then
closeHandle(self.FileHandle);
end;
end.
------------------------------