xmemory.pas

来自「我自己用的Delphi函数单元 具体说明见打包文件的HELP目录下面」· PAS 代码 · 共 119 行

PAS
119
字号
unit xMemory;

interface

uses Windows, SysUtils;

//------------------------------------------------------------------//
function IsMemAddressReadable(P: Pointer; Size: DWORD = 4): Boolean;
function IsMemAddressWritable(P: Pointer; Size: DWORD = 4): Boolean;

//------------------------------------------------------------------//
procedure TryReadMemAddress(P: Pointer; Size: DWORD = 4);
procedure TryWriteMemAddress(P: Pointer; Size: DWORD = 4);

//------------------------------------------------------------------//
function  FileMapOpen(const MapName: string; Size: Integer; var Ptr: Pointer): THandle;
procedure FileMapClose(Handle: THandle; var Ptr: Pointer);
function  IsFileMapExists(const MapName: string): Boolean;


implementation

//------------------------------------------------------------------//
//测试某段内存是否可读,p:指向内存开头,Size:内存大小。
function IsMemAddressReadable(P: Pointer; Size: DWORD = 4): Boolean;
begin
  Result := not IsBadReadPtr(P, Size);
end;

//------------------------------------------------------------------//
//测试某段内存是否可写,p:指向内存开头,Size:内存大小。
function IsMemAddressWritable(P: Pointer; Size: DWORD = 4): Boolean;
begin
  Result := not IsBadWritePtr(P, Size);
end;

//------------------------------------------------------------------//
//测试某段内存是否可读,p:指向内存开头,Size:内存大小。若不能读产生异常。
procedure TryReadMemAddress(P: Pointer; Size: DWORD = 4);
begin
  if not IsMemAddressReadable(P, Size) then
    raise EAccessViolation.CreateFmt('Can''t read address %p',[P]);
end;

//------------------------------------------------------------------//
//测试某段内存是否可写,p:指向内存开头,Size:内存大小。若不能写产生异常。
procedure TryWriteMemAddress(P: Pointer; Size: DWORD = 4);
begin
  if not IsMemAddressWritable(P, Size) then
    raise EAccessViolation.CreateFmt('Can''t write address %p',[P]);
end;

//------------------------------------------------------------------//
//打开文件内存映象
//MapName:映象名称; Size:映象大小; Ptr:指向映象内存的指针。
//用于建立可被所有进程,模块分享的全局数据结构。
//例如:
{
var
	pGlobal: ^TSharedData;
	hMap: THandle;
	
	hMap := FileMapOpen('MyMapFile',Sizeof(TSharedData),Pointer(pGlobal));
	//与其它模块共享pGlobal指向的TSharedData结构,可任意读写此结构的数据。
	FileMapClose(hMap,,Pointer(pGlobal));
}

function FileMapOpen(const MapName: string; Size: Integer; var Ptr: Pointer): THandle;
begin
  Result := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, Size, PChar(MapName));
  
  if Result = 0 then
    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      Result := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(MapName));
      if Result = 0 then Exit;
    end else Exit;
  
  Ptr := MapViewOfFile(Result, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  if Ptr = nil then
  begin
    CloseHandle(Result);
    Result := 0;
  end;
end;

{$HINTS OFF}
//------------------------------------------------------------------//
//关闭文件内存映象
procedure FileMapClose(Handle: THandle; var Ptr: Pointer);
begin
  if Assigned(Ptr) then
  begin
    UnmapViewOfFile(Ptr);
    Ptr := nil;
  end;

  if Handle <> 0 then
  begin
    CloseHandle(Handle);
    Handle := 0;
  end;
end;
{$HINTS ON}

//------------------------------------------------------------------//
//文件内存映象是否已存在?
function IsFileMapExists(const MapName: string): Boolean;
var
  hMap: THandle;
begin
  hMap := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(MapName));
  Result := hMap <> 0;
  if Result then CloseHandle(hMap);
end;

end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?