Delphi 内存映射实现两个进程间通信

写入方代码

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  PShareMem = ^TShareMem;
  TShareMem = Record
    id:string[8];
    name:string[20];
    age:Integer;
  end;
  
type
  TForm1 = class(TForm)
    mmo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    PShare: PShareMem;
    HMapping: THandle;
    shareMemName: string; //共享内存名
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  shareMemName:='GxMap';
  //fillchar(pshare^, sizeof(TShareMem), 0); //初始化地址空间
  //创建“内存映射文件”
   hmapping:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TShareMem), PChar(shareMemName));
   if hmapping <> 0 then
   begin
     mmo1.Lines.Add('已成功创建内存映射文件!');
   end;
   //将“内存映射文件”与“应用程序地址空间”建立映射关系
  pshare:=MapViewOfFile(hmapping,FILE_MAP_ALL_ACCESS,0,0,sizeof(TShareMem));
  if pshare = nil then
  begin
    closehandle(hmapping);
    mmo1.Lines.Add('映像映射失败!');
    exit;
  end
  else
  begin
    mmo1.Lines.Add('成功建立!');
  end;

   pshare.id:='1';
   pshare.name:='共享测试';
   pshare.age:=18;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  //解除“内存文件”与“应用程序地址空间”的映射关系
  if pshare<> nil then
     UnmapViewOfFile(pshare);
  //关闭内存映射文件
  if hmapping<> 0 then
     CloseHandle(hmapping);
end;

end.

读取方代码:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  PShareMem = ^TShareMem;
  TShareMem = Record
    id :string[8]; 
    name:string[20];
    age:Integer;
  end;
type
  TForm1 = class(TForm)
    btn1: TButton;
    mmo1: TMemo;
    procedure btn1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    HMapping : THandle;//内存映射文件句柄
    shareMemName:string; //共享内存名
    pUserShareMem : PShareMem;//指向共享内存的指针
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
  suser:string;
begin
  shareMemName := 'GxMap';  //需要和创建的相同
  HMapping := OpenFileMapping(FILE_MAP_ALL_ACCESS, false, pchar(shareMemName));
  if HMapping <> 0 then
  begin
    mmo1.Lines.Add('打开内存映射文件')
  end;

  pUserShareMem := MapViewOfFile(HMapping, windows.FILE_MAP_ALL_ACCESS, 0, 0, sizeof(TShareMem));
  if pUserShareMem <> nil then
  begin
    mmo1.Lines.Add('建立映射关系');
  end;

  if pUserShareMem <> nil then
  begin
    mmo1.Lines.Add( 'ID:' + pUserShareMem.id );
    mmo1.Lines.Add( '姓名:' + pUserShareMem.name );
    mmo1.Lines.Add( '年龄:' + IntToStr(pUserShareMem.age));
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 if pUserShareMem<> nil then
     UnmapViewOfFile(pUserShareMem);

  if HMapping<> 0 then
     CloseHandle(HMapping);

end;

end.

最后效果:

如果用一个程序启动的另一个程序,可以如下传递参数,参数用空格分开‘1 2’

 ShellExecute(Application.Handle, 'OPEN', PChar('..\Project2.exe'), '1 2', '', SW_SHOWNORMAL);

获取

ParamStr(0)//程序的带文件名的路径

ParamStr(1)//1

ParamStr(2)//2

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi中的内存映射共享数据是一种在不同进程之间共享数据的方法。它允许多个进程访问同一块内存区域,以实现数据共享和交互。 在Delphi中,可以使用TMemoryMappedFile和TMemoryMappedView来实现内存映射共享数据。首先,使用TMemoryMappedFile创建一个内存映射文件,并指定文件的名称和大小。然后,使用TMemoryMappedView来创建一个内存映射视图,将内存映射文件加载到当前进程的内存中。 一旦内存映射文件被加载到内存中,不同进程可以通过该文件进行数据的读写操作。每个进程可以将数据写入内存映射视图中的指定位置,并通过内存地址进行数据访问。当一个进程修改了内存映射视图中的数据后,其他进程也可以看到这些改变。 使用内存映射共享数据的好处是可以提高进程间通信的效率和速度。相比于其他通信方式如管道或消息队列,内存映射共享数据可以直接在内存中读写数据,避免了数据的拷贝和传输,提高了数据的访问速度。 当然,使用内存映射共享数据也需要注意一些问题。由于多个进程可以同时访问和修改数据,需要进行合理的同步和互斥操作,以避免数据的竞争和冲突。此外,对于不同的数据类型和结构,需要正确地定义和解释数据的格式和布局,以确保不同进程之间的数据共享和解析的一致性。 总而言之,Delphi中的内存映射共享数据是一种高效、灵活的进程间通信方式,可以实现数据共享和交互。通过合理的设计和操作,可以实现进程间数据的高速读写和同步,满足不同应用场景的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值