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中的不同窗體可以共享部件庫。10.4.1 利用DLLs實現窗體重用的一般步驟
利用DLLs實現窗體重用的步驟是:
1.在集成開發環境(IDE)中,按自己的需要設計一個窗體;
2.編寫一個用於輸出的函數或過程。在該函數或過程中,設計的窗體被實例化;