【Delphi 开箱即用 8】多进程之间共享内存的封装单元
多进程之间通信最简单的方式莫过于共享内存。为了满足不同场景下的需求,我直接封装了共享内存单元,方便调用,从而节省大量的开发时间和精力。
需求分析
-
跨版本 Delphi 通信
老项目使用 Delphi 7,新项目使用 Delphi 12,两者需要通过共享内存实现数据通信。 -
32 位与 64 位应用程序互通
在 32 位和 64 位应用程序之间传递数据时,共享内存是一种高效且可靠的解决方案。 -
Delphi 与其他语言(如 C++)的通信
当 Delphi 需要与其他编程语言(如 C++)进行数据交互时,共享内存可以作为一种通用的通信方式。 -
支持复杂数据类型
为了满足更灵活的数据互通需求,共享内存单元需要支持共享记录类型(Record)和内存流(Memory Stream),以便处理结构化和非结构化数据。
解决方案
针对上述需求,我们封装了一个通用的共享内存单元,具备以下特点:
- 跨版本兼容:支持 Delphi 7 到 Delphi 11 的共享内存通信。
- 跨平台兼容:支持 32 位和 64 位应用程序之间的数据互通。
- 跨语言支持:提供与其他编程语言(如 C++)的无缝数据交互能力。
- 灵活数据类型:支持共享记录类型和内存流,满足复杂数据的传输需求。
通过这一封装,开发者可以直接调用共享内存单元,快速实现多进程间的数据通信,显著提升开发效率。有需要该封装单元的可以联系我。
调用封装单元代码:
unit Unit3;
interface
uses
{$IFDEF DELPHI16_UP}
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls,
{$ELSE}
Windows, Messages, SysUtils, Variants, Classes, Forms, StdCtrls, Controls,
{$ENDIF}
uSharedMemoryManager;
type
TForm3 = class(TForm)
Memo2: TMemo;
Memo1: TMemo;
Button3: TButton;
Button4: TButton;
Button1: TButton;
Button2: TButton;
Memo3: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
FShareMemStreamRec: TShareMemStreamRec;
FShareMemStreamMgr: TShareMemStreamMgr;
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
// 写入共享文件
procedure TForm3.Button1Click(Sender: TObject);
var
LStream: TMemoryStream;
begin
LStream := TMemoryStream.Create;
try
LStream.LoadFromFile('Copy.xml');
FShareMemStreamRec.Token := '9692d7d694d44c9d858fe83317e80c4f';
FShareMemStreamRec.Description := 'This is Description';
FShareMemStreamMgr.SetShareMemContent(@FShareMemStreamRec, LStream);
finally
LStream.Free;
end;
end;
// 读出共享文件
procedure TForm3.Button2Click(Sender: TObject);
var
LStream: TMemoryStream;
begin
LStream := TMemoryStream.Create();
try
FShareMemStreamRec := FShareMemStreamMgr.GetShareMemContent(LStream);
Memo3.Lines.Add(FShareMemStreamRec.Token);
Memo3.Lines.Add(FShareMemStreamRec.Description);
if LStream.Size > 0 then
LStream.SaveToFile('Paste.xml')
finally
LStream.Free;
end;
end;
// 写入字符串
procedure TForm3.Button3Click(Sender: TObject);
var
LStream: TStringStream;
begin
LStream := TStringStream.Create(Memo1.Text);
try
FShareMemStreamRec.Token := '9692d7d694d44c9d858fe83317e80c4f';
FShareMemStreamRec.Description := 'This is Description';
FShareMemStreamMgr.SetShareMemContent(@FShareMemStreamRec, LStream);
finally
LStream.Free;
end;
end;
// 读出字符串
procedure TForm3.Button4Click(Sender: TObject);
var
LStream: TStringStream;
begin
LStream := TStringStream.Create('');
try
FShareMemStreamRec := FShareMemStreamMgr.GetShareMemContent(LStream);
Memo3.Lines.Add(FShareMemStreamRec.Token);
Memo3.Lines.Add(FShareMemStreamRec.Description);
if LStream.Size > 0 then
Memo2.Text := LStream.DataString;
finally
LStream.Free;
end;
end;
procedure TForm3.FormCreate(Sender: TObject);
begin
FShareMemStreamMgr := TShareMemStreamMgr.Create;
FShareMemStreamMgr.SetShareMemName('PM_SM_Clipboard_TT');
end;
procedure TForm3.FormDestroy(Sender: TObject);
begin
FShareMemStreamMgr.Free;
end;
end.