程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Delphi中進程間的數據共享

Delphi中進程間的數據共享

編輯:更多關於編程

      DLL是創建Windows應用程序,實現代碼重用的重要手段。那麼當我們需要在進程間共享數據時,怎樣做才能快捷方便地實現呢?在32位應用系統中,每個應用程序會將DLL映射到自己的地址空間,同時DLL中的數據也就隨之被映射了。這樣,每個應用程序都有自己的數據實例,在一個應用程序中修改DLL中的全局變量,不會影響其它的應用程序。DLL的使用似乎與我們的目的相背離,那麼如何才能實現我們想要的東東呢?這裡給大家介紹一種特殊的技術,那就是內存映射文件。

      內存映射文件提供了一種方法,就是在WIN32系統的地址空間保留一塊內存區域,物理存儲可以向其中提交。並且內存映射文件不只是磁盤文件,也可以是WIN32的頁面文件,而且後者比前者要好,因為這意味著可以像訪問一個磁盤文件那樣訪問內存中的一個區域,而不用創建臨時文件,用完後還得刪除它。WIN32有自己的管理頁面調度文件,當不需要頁面調度文件時,系統會自動將有關區域釋放。以下是具體的實現代碼:

      library Project1;

      uses

      shareMem,

      windows,

      SysUtils,

      Classes;

      const

      MFileName: Pchar = ’ShareData’;

      //定義一個記錄類型,你所需要共享的數據就保存在這裡。

      //當在進程中調用GetDllData時,進程中也應該定義一個與這個一樣的記錄類型。

      type

      PGlobalDllData = ^TGlobalDllData;

      TGlobalDllData = record

      s: string[50];

      i: integer;

      end;

      var

      GlobalData: PGlobalDllData; //這是一個全局變量,指向創建的內存映射文件。

      MapHandle: THandle;

      //給外部進程調用的過程,當外部進程調用這個過程後,形參AGlobalData就指向了我//們創建的內存映射文件. 我們可以創建兩個進程, 同時調用這個過程, 那麼在其中一個進 //程中修改數據後, 在另外一個進程中既可反應出來, 實現了我們需要的共享.

      procedure GetDllData(var AGlobalData: PGlobalDllData);stdcall; begin

      AGlobalData := GlobalData;

      end;

      procedure OpenThisData;

      var

      size: integer;

      begin

      size := sizeof(TGlobalDllData);

      //創建一個內存文件映射對象,MfileName保存的值就是該對象的名字。

      mapHandle := CreateFileMapping(Dword(-1), nil, page_readWrite, 0, size, MFileName);

      if mapHandle = 0 then

      RaiseLastWin32Error;

      //把文件的視圖映射到調用進程的地址空間,該函數的返回值就是該對象的首地址。注//意,這是調用進程的地址,兩個應用程序調用該DLL,返回值是不一樣的。

      GlobalData := MapViewOfFile(mapHandle, File_map_all_Access, 0, 0, size);

      Globaldata^.s := ’TEST’;

      GlobalData^.i := 5;

      if GlobalData = nil then

      begin

      CloseHandle(MapHandle);

      RaiseLastWin32Error;

      end;

      end;

      //DLL從進程中分離出來時,應該釋放相應的空間

      procedure CloseThisData;

      begin

      unmapViewOfFile(GlobalData);

      closeHandle(MapHandle);

      end;

      procedure DllEntryPoint(dwReason: DWord);

      begin

      case dwReason of

      Dll_Process_Attach: OpenThisData; //調用DLL時傳入的參數,由系統自動傳入

      Dll_Process_Detach: CloseThisData; //釋放DLL時傳入的參數,系統自動傳入。

      end;

      end;

      {$R *.res}

      exports

      GetDllData; //外部應用程序調用的就是這個過程。

      begin

      DllProc := @DllEntryPoint; //該變量是一個全局變量,由它來指定DLL的入口及出 //口函數。

      DllEntryPoint(Dll_Process_Attach);

      end.

      //以上代碼在DELPHI6中編譯通過。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved