程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 第十章-動態鏈接庫編程(二)(1)

第十章-動態鏈接庫編程(二)(1)

編輯:Delphi

10.3.2.2 服務器程序的編寫 

服務器程序必須包含對DLL的調用代碼,如: 

function GetGlobalMem: THandle; far; external 'c:\dlls\glbmem';

通過調用該函數,服務器可以獲得全局內存塊的句柄。

在寫入數據前,服務器必須鎖定全局內存,以避免在寫入過程中Windows移動該內存塊的位置。

函數GlobalLock鎖定全局內存並返回指向該內存塊的指針: 

pMem := GlobalLock(hMem);

對pMem的任何修改都會反映到全局內存塊中。

對內存塊進行操作後,調用GlobalUnLock進行解鎖。內存塊操作之後盡早解鎖,有利於Windows充分利用內存資源。

服務器寫入數據的實現代碼如下。 

var

hMem: THandle;

pMem: PChar;

begin

hMem := GetGlobalMem; {獲得全局內存塊的句柄}

if hMem <> 0 then

begin

pMem := GlobalLock(hMem); {加鎖全局內存塊}

if pMem <> nil then

begin

StrPCopy(pMem,Memo1.text); {向全局內存塊寫入數據}

GlobalUnlock(hMem); {解鎖全局內存塊}

end

else

MessageDlg('Couldnot Lock memory block',mtWarning,[mbOK],0);

end; 

10.3.2.3 客戶程序的編寫 

客戶程序幾乎是服務器程序的翻版。唯一的區別在於一個是寫入數據,一個是下載數據。

下面是客戶從全局內存塊下載數據的程序清單。 

var

hMem: THandle;

pMem: PChar;

begin

hMem := GetGlobalMem; {獲得全局內存塊的句柄}

if hMem <> 0 then

begin

pMem := GlobalLock(hMem); {加鎖全局內存塊}

if pMem <> nil then

begin

Memo1.text := StrPas(pMem); {從全局內存塊讀取數據}

GlobalUnlock(hMem); {解鎖全局內存塊}

end

else

MessageDlg('Couldnot Lock memory block',mtWarning,[mbOK],0);

end;

10.4 利用DLLs實現窗體重用 

實現窗體重用是Delphi DLLs功能中一個引人注目的特色。當你創建了一個令自己滿意的通用窗體並希望能在不同應用程序中使用,特別是希望能在非Delphi 應用程序中使用時,把窗體做進一個動態鏈接庫中是最適當的。這樣即使用其它工具開發的應用程序,如C++、Visual Basic等,也都可以去調用它。

包含窗體的DLLs有100K左右的部件庫(Component Library)開銷。可以通過把幾個窗體編譯成一個DLLs來最小化這筆開銷。DLl中的不同窗體可以共享部件庫。 

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