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; 

     

     

     

  • 相关阅读:
    一个500人使用的后台服务站点优化过程
    关于一个每天请求50W次接口的设计实现过程
    Exception in thread "main" java.lang.NoSuchMethodError: scala.actors.AbstractActor.$init$(Lscala/actors/AbstractActor;)V
    搭建hadoop集群的免密钥登录配置
    Hive入门小结
    Jvm垃圾收集器和垃圾回收算法
    Java内存区域与对象创建过程
    得到直播,宁向东的清华管理学课。
    pandas中merge的使用
    少看别人写的文章,多看优秀的代码
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2940750.html
Copyright © 2011-2022 走看看