内存映象文件的应用——多个程序共享内存

内存映象文件

   使用内存映象文件,当访问磁盘上的文件时,就如同访问内存中的文件一样
  
以上是我看 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.

------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值