两个EXE文件共享内存数据块

发送数据端程序

代码文件:
  1. unit Unit1;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   StdCtrls;
  6. const
  7.   WM_DATA = WM_USER + 1024;
  8. type
  9.   PShareMem = ^TShareMem;
  10.   TShareMem = record
  11.     Data: array[0..255of char;
  12.   end;
  13.   TForm1 = class(TForm)
  14.     Button1: TButton;
  15.     procedure Button1Click(Sender: TObject);
  16.     procedure FormDestroy(Sender: TObject);
  17.     procedure FormCreate(Sender: TObject);
  18.   private
  19.     { Private declarations }
  20.   public
  21.     { Public declarations }
  22.   end;
  23. var
  24.   Form1: TForm1;
  25.   PShare: PShareMem;
  26. implementation
  27. {$R *.DFM}
  28. var
  29.   HMapping: THandle;
  30.   HMapMutex: THandle;
  31. const
  32.   MAPFILESIZE = 1000;
  33.   REQUEST_TIMEOUT = 1000;
  34. procedure OpenMap;
  35. begin
  36.    {创建一个文件映射内核对象}
  37.   HMapping := CreateFileMapping(
  38.     $FFFFFFFF,
  39.     nil,
  40.     PAGE_READWRITE,
  41.     0,
  42.     SizeOf(TShareMem),
  43.                  {这个文件映射对象的名字用于与其他进程共享该对象,}
  44.    pchar('Map Name')
  45.     );
  46.   if (hMapping = 0then
  47.   begin
  48.     ShowMessage('不能创建内存映射文件');
  49.     Application.Terminate;
  50.     exit;
  51.   end;
  52.    {将文件数据映射到进程的地址空间}
  53.    {当创建了一个文件映射对象之后,仍然必须让系统为文件的数据保留
  54.     一个地址空间区域,并将文件的数据作为映射到该区域的物理存储器进行提交。
  55.     }
  56.   PShare := PShareMem(MapViewOfFile(HMapping, FILE_MAP_ALL_ACCESS, 000));
  57.   if PShare = nil then
  58.   begin
  59.     CloseHandle(HMapping);
  60.     ShowMessage('Can''t View Memory Map');
  61.     Application.Terminate;
  62.     exit;
  63.   end;
  64.   {既然我们通过pvFile得到了映象视图的起始地址,那么可以对视图做一些操作了}
  65. end;
  66. procedure CloseMap;
  67. begin
  68.   if PShare <> nil then
  69.     {从进程的地址空间中撤销文件数据的映象}
  70.     UnMapViewOfFile(PShare);
  71.   if HMapping <> 0 then
  72.     CloseHandle(HMapping);
  73. end;
  74. function LockMap: Boolean;
  75. begin
  76.   Result := true;
  77.    {创建互斥对象}
  78.   HMapMutex := CreateMutex(nilfalse,
  79.     pchar('MY MUTEX NAME GOES HERE'));
  80.   if HMapMutex = 0 then
  81.   begin
  82.     ShowMessage('不能创建互斥对象');
  83.     Result := false;
  84.   end else begin
  85.     if WaitForSingleObject(HMapMutex, REQUEST_TIMEOUT)
  86.       = WAIT_FAILED then
  87.     begin
  88.       ShowMessage('不能对互斥对象加锁!');
  89.       Result := false;
  90.     end
  91.   end
  92. end;
  93. procedure UnlockMap;
  94. begin
  95.    {关闭文件映射对象和文件对象}
  96.   ReleaseMutex(HMapMutex);
  97.   CloseHandle(HMapMutex);
  98. end;
  99. procedure TForm1.Button1Click(Sender: TObject);
  100. var
  101.   str: pchar;
  102. begin
  103.   str := pchar('简单的共享内存的例子');
  104.   CopyMemory(@(pShare^.data), Str, Length(str));
  105.   {发送消息表明有数据}
  106.   PostMessage(FindWindow(nil'MyForm'), WM_DATA, 11)
  107. end;
  108. procedure TForm1.FormDestroy(Sender: TObject);
  109. begin
  110.   UnlockMap;
  111.   CloseMap;
  112. end;
  113. procedure TForm1.FormCreate(Sender: TObject);
  114. begin
  115.   OpenMap;
  116.   LockMap;
  117. end;
  118. end.
窗体文件:
  1. object Form1: TForm1
  2.   Left = 189
  3.   Top = 107
  4.   Caption = #20869#23384#26144#23556#25991#20214#20363#23376
  5.   ClientHeight = 86
  6.   ClientWidth = 200
  7.   Color = clBtnFace
  8.   Font.Charset = GB2312_CHARSET
  9.   Font.Color = clWindowText
  10.   Font.Height = -13
  11.   Font.Name = #23435#20307
  12.   Font.Style = []
  13.   OldCreateOrder = False
  14.   OnCreate = FormCreate
  15.   OnDestroy = FormDestroy
  16.   PixelsPerInch = 96
  17.   TextHeight = 13
  18.   object Button1: TButton
  19.     Left = 56
  20.     Top = 24
  21.     Width = 75
  22.     Height = 25
  23.     Caption = #21457#36865#25968#25454
  24.     TabOrder = 0
  25.     OnClick = Button1Click
  26.   end
  27. end
接受数据端程序

代码:
  1. unit Unit2;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   StdCtrls;
  6. const
  7.   WM_DATA = WM_USER + 1024;
  8. type
  9.   PShareMem = ^TShareMem;
  10.   TShareMem = record
  11.     Data: array[0..255of char;
  12.   end;
  13.   TMyForm = class(TForm)
  14.     Memo1: TMemo;
  15.     Button1: TButton;
  16.     procedure FormCreate(Sender: TObject);
  17.     procedure Button1Click(Sender: TObject);
  18.   private
  19.     { Private declarations }
  20.   public
  21.     { Public declarations }
  22.     procedure getShareInfo(var Msg: TMessage); message WM_DATA; {处理WM_DATA}
  23.   end;
  24. var
  25.   MyForm: TMyForm;
  26.   PShare: PShareMem;
  27.   MapHandle: THandle;
  28. implementation
  29. {$R *.DFM}
  30. procedure TMyForm.getShareInfo(var Msg: TMessage); {处理WM_DATA}
  31. begin
  32.   if msg.LParam=1 then {是我们设定的消息参数}
  33.     Memo1.Text := PShare^.Data;
  34. end;
  35. procedure TMyForm.FormCreate(Sender: TObject);
  36. begin
  37.   MapHandle := OpenFileMapping(FILE_MAP_WRITE, {获取完全访问映射文件}
  38.     False, {不可继承的}
  39.     pchar('Map Name')); {映射文件名字}
  40.   if MapHandle = 0 then
  41.   begin
  42.     ShowMessage('不能定位内存映射文件块!');
  43.     Halt;
  44.   end;
  45.   PShare := PShareMem(MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 000));
  46.   if PShare = nil then
  47.   begin
  48.     CloseHandle(MapHandle);
  49.     ShowMessage('Can''t View Memory Map');
  50.     Application.Terminate;
  51.     exit;
  52.   end;
  53.   FillChar(PShare^, SizeOf(TShareMem), 0);
  54. end;
  55. procedure TMyForm.Button1Click(Sender: TObject);
  56. begin
  57.   CloseHandle(MapHandle);
  58.   close;
  59. end;
  60. end.
窗体文件:
  1. object MyForm: TMyForm
  2.   Left = 192
  3.   Top = 107
  4.   Caption = 'MyForm'
  5.   ClientHeight = 108
  6.   ClientWidth = 293
  7.   Color = clBtnFace
  8.   Font.Charset = GB2312_CHARSET
  9.   Font.Color = clWindowText
  10.   Font.Height = -13
  11.   Font.Name = #23435#20307
  12.   Font.Style = []
  13.   OldCreateOrder = False
  14.   OnCreate = FormCreate
  15.   PixelsPerInch = 96
  16.   TextHeight = 13
  17.   object Memo1: TMemo
  18.     Left = 8
  19.     Top = 8
  20.     Width = 185
  21.     Height = 89
  22.     Lines.Strings = (
  23.       'Memo1')
  24.     TabOrder = 0
  25.   end
  26.   object Button1: TButton
  27.     Left = 200
  28.     Top = 24
  29.     Width = 75
  30.     Height = 25
  31.     Caption = #20851#38381
  32.     TabOrder = 1
  33.     OnClick = Button1Click
  34.   end
  35. end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值