zoukankan      html  css  js  c++  java
  • 通过内存映像文件共享一组对象

    通过内存映像文件共享一组对象(主程序和动态库或者各进程之间共享一组对象)

     

    //单元设计: 陈新光(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; 

     

     

     

  • 相关阅读:
    java多线程实例
    Python——文件操作
    Python—— *与** 参数说明
    Python——序列
    多元线性回归
    Gson转换时,Double转式化
    ftp上传下载
    发送邮件
    jsonp的使用
    用CSS3和Canvas来画网格
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2940750.html
Copyright © 2011-2022 走看看