zoukankan      html  css  js  c++  java
  • delphi内存映射(跨平台)

    delphi内存映射(跨平台)

    /// <author>cxg 2020-12-9</author>
    
    unit yn.map;
    
    interface
    
    uses
      SysUtils,
      {$IFDEF posix}
      Posix.SysMman
      {$ENDIF}
      {$IFDEF mswindows}
      Windows
      {$ENDIF}
      ;
    
    type
      PShareMem = ^TShareMem;
    
      TShareMem = record
        size: Cardinal;
        data: Pointer;
      end;
    
    type
      TWriteRead = procedure (data: pointer) of object;
    
      TMemMap = class
      private
        FShareMemName: string;
        FFileHandle: THandle;
        p: PShareMem;
        FWrite: TWriteRead;
        FRead: TWriteRead;
      public
        constructor Create(const ShareMemName: string; data: Pointer; const dataLen: Cardinal); overload;
        destructor Destroy; override;
      public
        function createFileMap: Boolean;
        function map: Boolean;
        function unMap: Boolean;
        function openFileMap: Boolean;
        function closeFileMap: Boolean;
      public
        procedure write;
        procedure read;
      public
        property OnWrite: TWriteRead read FWrite write FWrite;
        property OnRead: TWriteRead read FRead write FRead;
      end;
    
    implementation
    
    { TMemMap }
    
    function TMemMap.closeFileMap: Boolean;
    begin
      {$IFDEF mswindows}
      Result := CloseHandle(FFileHandle);
      {$ENDIF}
    end;
    
    constructor TMemMap.Create(const ShareMemName: string; data: Pointer; const dataLen: Cardinal);
    begin
      FFileHandle := 0;
      FShareMemName := ShareMemName;
      New(p);
      p^.data := data;
      p^.size := dataLen;
    end;
    
    function TMemMap.createFileMap: Boolean;
    begin
      {$IFDEF mswindows}
      FFileHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, p^.size, PChar(FShareMemName));
      Result := FFileHandle <> 0;
      {$ENDIF}
    end;
    
    destructor TMemMap.Destroy;
    begin
      self.closeFileMap;
      Dispose(p^.data);
      Dispose(p);
      inherited;
    end;
    
    function TMemMap.map: Boolean;
    begin
      {$IFDEF mswindows}
      p^.data := MapViewOfFile(FFileHandle, FILE_MAP_ALL_ACCESS, 0, 0, p^.size);
      Result := p <> nil;
      {$ELSE}
      mmap(p^.data, p^.size, PROT_READ or PROT_WRITE, MAP_SHARED, 0, 0);
      {$ENDIF}
    end;
    
    function TMemMap.openFileMap: Boolean;
    begin
      {$IFDEF mswindows}
      FFileHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, false, PChar(FShareMemName));
      Result := FFileHandle <> 0;
      {$ENDIF}
    end;
    
    procedure TMemMap.read;
    begin
      openFileMap;
      self.map;
      if Assigned(FRead) then
        FRead(p^.data);
      Self.unMap;
    end;
    
    function TMemMap.unMap: Boolean;
    begin
      {$IFDEF mswindows}
      Result := UnmapViewOfFile(p^.data);
      {$ELSE}
      munmap(p^.data, p^.size);
      {$ENDIF}
    end;
    
    procedure TMemMap.write;
    begin
      if FFileHandle = 0 then
        self.createFileMap;
      map;
      if Assigned(FWrite) then
        FWrite(p^.data);
      Self.unMap;
    end;
    
    end.
    

      

      

  • 相关阅读:
    React 组件的生命周期方法
    Ant Design 错误记录与常用例子
    roadhog中如何拷贝文件
    API加密框架monkey-api-encrypt发布1.2版本
    必杀技:当报错信息看不出原因时,怎么办?
    当Spring Cloud Alibaba Sentinel碰上Spring Cloud Sleuth会擦出怎样的火花
    Kitty-Cloud服务搭建过程剖析
    Maven快照版本要这样用才真的香!
    Kitty-Cloud环境准备
    双剑合璧的开源项目Kitty-Cloud
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/14108131.html
Copyright © 2011-2022 走看看