商务网站安全方案设计市场营销互联网营销
多进程之间通信最简单的方式莫过于共享内存。为了满足不同场景下的需求,我直接封装了共享内存单元,方便调用,从而节省大量的开发时间和精力。
需求分析
-
跨版本 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;interfaceuses{$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;typeTForm3 = 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);privateFShareMemStreamRec: TShareMemStreamRec;FShareMemStreamMgr: TShareMemStreamMgr;public{ Public declarations }end;varForm3: TForm3;implementation{$R *.dfm}// 写入共享文件
procedure TForm3.Button1Click(Sender: TObject);
varLStream: TMemoryStream;
beginLStream := TMemoryStream.Create;tryLStream.LoadFromFile('Copy.xml');FShareMemStreamRec.Token := '9692d7d694d44c9d858fe83317e80c4f';FShareMemStreamRec.Description := 'This is Description';FShareMemStreamMgr.SetShareMemContent(@FShareMemStreamRec, LStream);finallyLStream.Free;end;
end;// 读出共享文件
procedure TForm3.Button2Click(Sender: TObject);
varLStream: TMemoryStream;
beginLStream := TMemoryStream.Create();tryFShareMemStreamRec := FShareMemStreamMgr.GetShareMemContent(LStream);Memo3.Lines.Add(FShareMemStreamRec.Token);Memo3.Lines.Add(FShareMemStreamRec.Description);if LStream.Size > 0 thenLStream.SaveToFile('Paste.xml')finallyLStream.Free;end;
end;// 写入字符串
procedure TForm3.Button3Click(Sender: TObject);
varLStream: TStringStream;
beginLStream := TStringStream.Create(Memo1.Text);tryFShareMemStreamRec.Token := '9692d7d694d44c9d858fe83317e80c4f';FShareMemStreamRec.Description := 'This is Description';FShareMemStreamMgr.SetShareMemContent(@FShareMemStreamRec, LStream);finallyLStream.Free;end;
end;// 读出字符串
procedure TForm3.Button4Click(Sender: TObject);
varLStream: TStringStream;
beginLStream := TStringStream.Create('');tryFShareMemStreamRec := FShareMemStreamMgr.GetShareMemContent(LStream);Memo3.Lines.Add(FShareMemStreamRec.Token);Memo3.Lines.Add(FShareMemStreamRec.Description);if LStream.Size > 0 thenMemo2.Text := LStream.DataString;finallyLStream.Free;end;
end;procedure TForm3.FormCreate(Sender: TObject);
beginFShareMemStreamMgr := TShareMemStreamMgr.Create;FShareMemStreamMgr.SetShareMemName('PM_SM_Clipboard_TT');
end;procedure TForm3.FormDestroy(Sender: TObject);
beginFShareMemStreamMgr.Free;
end;end.