左半脑思维 發表於 2022-4-10 16:41:00

delphi内存镜像

<div class="cnblogs_code">
<pre><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;author&gt;</span><span style="color: rgba(0, 128, 0, 1)">cxg 2020-12-9</span><span style="color: rgba(128, 128, 128, 1)">&lt;/author&gt;</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 &lt;&gt; <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 &lt;&gt;<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 &lt;&gt; <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>&nbsp;</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]
查看完整版本: delphi内存镜像