delphi内存镜像
<div class="cnblogs_code"><pre><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><author></span><span style="color: rgba(0, 128, 0, 1)">cxg 2020-12-9</span><span style="color: rgba(128, 128, 128, 1)"></author></span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 内存映射 支持跨os
</span><span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> xe10.2及以上版本适用</span>
<span style="color: rgba(0, 0, 0, 1)">
unit yn.map;
</span><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)">
uses
SysUtils, SyncObjs
{$IFDEF posix}
, Posix.SysMman
{$ELSE}
, Windows
{$ENDIF}
;
type
PMem </span>= ^<span style="color: rgba(0, 0, 0, 1)">TMem;
TMem </span>=<span style="color: rgba(0, 0, 0, 1)"> record
size: Cardinal;
data: Pointer;
end;
type
TWriteRead </span>=<span style="color: rgba(0, 0, 0, 1)"> reference to procedure(data: pointer);
TMemMap </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)">
FShareMemName: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
{$IFDEF mswindows}
FFileHandle: THandle;
{$ENDIF}
p: PMem;
cs: TCriticalSection;
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)">
constructor Create(</span><span style="color: rgba(0, 0, 255, 1)">const</span> ShareMemName: <span style="color: rgba(0, 0, 255, 1)">string</span>; data: Pointer; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> dataLen: Cardinal); overload;
destructor Destroy; </span><span style="color: rgba(0, 0, 255, 1)">override</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)">
function map: Boolean;
function unMap: Boolean;
{$IFDEF mswindows}
function createFileMap: Boolean;
function openFileMap: Boolean;
function closeFileMap: Boolean;
{$ENDIF}
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)">
procedure write(</span><span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">: TWriteRead);
procedure read(</span><span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">: TWriteRead);
end;
implementation
{ TMemMap }
{$IFDEF mswindows}
function TMemMap.closeFileMap: Boolean;
begin
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> CloseHandle(FFileHandle);
end;
{$ENDIF}
constructor TMemMap.Create(</span><span style="color: rgba(0, 0, 255, 1)">const</span> ShareMemName: <span style="color: rgba(0, 0, 255, 1)">string</span>; data: Pointer; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> dataLen: Cardinal);
begin
cs :</span>=<span style="color: rgba(0, 0, 0, 1)"> TCriticalSection.Create;
FFileHandle :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
FShareMemName :</span>=<span style="color: rgba(0, 0, 0, 1)"> ShareMemName;
New(p);
p</span>^.data :=<span style="color: rgba(0, 0, 0, 1)"> data;
p</span>^.size :=<span style="color: rgba(0, 0, 0, 1)"> dataLen;
end;
{$IFDEF mswindows}
function TMemMap.createFileMap: Boolean;
begin
FFileHandle :</span>= CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, <span style="color: rgba(128, 0, 128, 1)">0</span>, p^<span style="color: rgba(0, 0, 0, 1)">.size, PChar(FShareMemName));
Result :</span>= FFileHandle <> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
end;
{$ENDIF}
destructor TMemMap.Destroy;
begin
Dispose(p</span>^<span style="color: rgba(0, 0, 0, 1)">.data);
Dispose(p);
cs.Free;
inherited;
end;
function TMemMap.map: Boolean;
begin
{$IFDEF mswindows}
p</span>^.data := MapViewOfFile(FFileHandle, FILE_MAP_ALL_ACCESS, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, p^<span style="color: rgba(0, 0, 0, 1)">.size);
Result :</span>= p <><span style="color: rgba(0, 0, 0, 1)"> nil;
{$ELSE}
mmap(p</span>^.data, p^.size, PROT_READ or PROT_WRITE, MAP_SHARED, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
{$ENDIF}
end;
function TMemMap.unMap: Boolean;
begin
{$IFDEF mswindows}
Result :</span>= UnmapViewOfFile(p^<span style="color: rgba(0, 0, 0, 1)">.data);
{$ELSE}
munmap(p</span>^.data, p^<span style="color: rgba(0, 0, 0, 1)">.size);
{$ENDIF}
end;
{$IFDEF mswindows}
function TMemMap.openFileMap: Boolean;
begin
FFileHandle :</span>= OpenFileMapping(FILE_MAP_ALL_ACCESS, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">, PChar(FShareMemName));
Result :</span>= FFileHandle <> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
end;
{$ENDIF}
procedure TMemMap.read(</span><span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">: TWriteRead);
begin
{$IFDEF mswindows}
openFileMap;
{$ENDIF}
self.map;
</span><span style="color: rgba(0, 0, 255, 1)">event</span>(p^<span style="color: rgba(0, 0, 0, 1)">.data);
Self.unMap;
end;
procedure TMemMap.write(</span><span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">: TWriteRead);
begin
{$IFDEF mswindows}
</span><span style="color: rgba(0, 0, 255, 1)">if</span> FFileHandle = <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)"> then
self.createFileMap;
{$ENDIF}
map;
cs.Enter;
</span><span style="color: rgba(0, 0, 255, 1)">try</span>
<span style="color: rgba(0, 0, 255, 1)">event</span>(p^<span style="color: rgba(0, 0, 0, 1)">.data);
</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
cs.Leave;
end;
Self.unMap;
end;
end.</span></pre>
</div>
<p> </p>
</div>
<div id="MySignature" role="contentinfo">
<p>本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/16126461.html</p><br><br>
来源:https://www.cnblogs.com/hnxxcxg/p/16126461.html
頁:
[1]