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中的不同窗體可以共享部件庫。