通过内存映像文件共享一组对象
通过内存映像文件共享一组对象(主程序和动态库或者各进程之间共享一组对象)
//单元设计: 陈新光(CXG)
//设计时间: 2009-10-8 16:51:40
//单元功用: 封装内存映射操作
unit uMap;
interface
uses
Windows, SysUtils, Dialogs;
procedure SetMappedObj(const AObj:Pointer);stdcall;
function GetMappedObj:Pointer;stdcall;
procedure Map(const DesiredAccess: DWORD = FILE_MAP_ALL_ACCESS); stdcall;
procedure Unmap(); stdcall;
implementation
const
SExceptionInfo = 'Error in calling MappedObj.dll.';
SMappedObjName = 'RocketGis.MappedObj';
type
PMappedObj = ^TMappedObj;
TMappedObj = packed record
Size: DWORD;
Data: Pointer;
end;
var
HasMapped: Boolean;
MappedObjHandle: THandle;
MappedObj: PMappedObj;
function GetMappedObj:Pointer; stdcall;
begin
Result := MappedObj^.data;
end;
procedure SetMappedObj(const AObj:Pointer);
begin
if not assigned(MappedObj^.Data) then
MappedObj^.Data := AObj;
end;
procedure Map(const DesiredAccess: DWORD); stdcall;
var
LSize: Integer;
begin
try
if HasMapped then exit ;
LSize := Sizeof(TMappedObj);
MappedObjHandle := CreateFileMapping(DWORD($FFFFFFFF),nil, PAGE_READWRITE,0,
LSize,SMappedObjName);
if MappedObjHandle = 0 then RaiseLastOSError();
MappedObj := MapViewOfFile(MappedObjHandle, DesiredAccess, 0, 0, LSize);
if not Assigned(MappedObj) then
begin
CloseHandle(MappedObjHandle);
RaiseLastOSError();
end;
HasMapped := true;
except
on Exception do
MessageDlg(SExceptionInfo,mtError, [mbOk],0);
end;
end;
procedure Unmap(); stdcall;
begin
try
if not HasMapped then exit;
UnmapViewOfFile(MappedObj);
CloseHandle(MappedObjHandle);
HasMapped := False;
except
on Exception do MessageDlg(SExceptionInfo, mtError, [mbOk], 0);
end;
end;
end.
调用示例:
// 定义一个全局共享对象的结构体
PShareObjRec = ^TShareObjRec;
TShareObjRec = record
Udpconnection: TRemoteUdpConnection;
employee: PTEmployeeRec;
imageList: TImageList;
end;
// 将全局对象映射进内存镜像文件里面
PShareObjRec.Udpconnection := RemoteUdpConnection1;
PShareObjRec.imageList := ImageList1;
uMap.SetMappedObj(PShareObjRec);
// 从内存镜像文件里面获取全局共享对象
function GetUdpconnection: TRemoteUdpConnection;
begin
Result := nil;
uMap.Map();
Result := PShareObjRec(uMap.GetMappedObj)^.Udpconnection;
uMap.Unmap;
end;
本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/archive/2009/10/22/2940750.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?