华南俳烁实业有限公司

考試首頁 | 考試用書 | 培訓課程 | 模擬考場 | 考試論壇  
  當前位置:編程開發(fā) > DotNET > Delphi.Net > 文章內容
  

Delphi基礎教程:DELPHI數(shù)據庫應用程序的開發(fā)環(huán)境介紹

 [ 2017年9月4日 ] 【

  Dll_Process_Detach: CloseThisData; //釋放DLL時傳入的參數(shù),系統(tǒng)自動傳入。深圳做網站的公司

  end;

  end;

  {$R *.res}

  exports

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

  begin

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

  DllEntryPoint(Dll_Process_Attach);

  end.

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

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

  library Project1;

  uses

  shareMem,

  windows,

  SysUtils,

  Classes;

  const

  MFileName: Pchar = ’ShareData’;

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

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

  type

  PGlobalDllData = ^TGlobalDllData;

  TGlobalDllData = record

  s: string[50];

  i: integer;

  end;

  var

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

  MapHandle: THandle;

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

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

  AGlobalData := GlobalData;

  end;

  procedure OpenThisData;

  var

  size: integer;

  begin

  size := sizeof(TGlobalDllData);

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

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

  if mapHandle = 0 then

  RaiseLastWin32Error;

  //把文件的視圖映射到調用進程的地址空間,該函數(shù)的返回值就是該對象的首地址。注//意,這是調用進程的地址,兩個應用程序調用該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時傳入的參數(shù),由系統(tǒng)自動傳入

  Dll_Process_Detach: CloseThisData; //釋放DLL時傳入的參數(shù),系統(tǒng)自動傳入。

  end;

  end;

  {$R *.res}

  exports

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

  begin

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

  DllEntryPoint(Dll_Process_Attach);

  end.

首頁 1 2 尾頁
本文糾錯】【告訴好友】【打印此文】【返回頂部
將考試網添加到收藏夾 | 每次上網自動訪問考試網 | 復制本頁地址,傳給QQ/MSN上的好友 | 申請鏈接 | 意見留言 TOP
關于本站  網站聲明  廣告服務  聯(lián)系方式  站內導航  考試論壇
Copyright © 2007-2013 中華考試網(Examw.com) All Rights Reserved
开江县| 沙雅县| 宁安市| 厦门市| 太谷县| 宿迁市| 西和县| 即墨市| 北票市| 东源县| 敦化市| 韩城市| 磴口县| 济阳县| 潼关县| 新龙县| 武功县| 阿巴嘎旗| 丰城市| 繁峙县| 晋宁县| 金沙县| 桃园市| 江西省| 类乌齐县| 顺义区| 耿马| 丁青县| 化德县| 礼泉县| 若尔盖县| 伊吾县| 徐闻县| 兰坪| 四会市| 凉城县| 庄河市| 隆德县| 乐至县| 永仁县| 晋江市|