4) DLL窗口控制
正如3)中的代碼說明的那樣,DLL窗口的打開和關閉只是在表象層,關閉窗口並沒有真正釋放DLL窗口,只是調用API函數FindWindow根據窗口標識(就是Form.name)獲得窗體句柄,用SHOWWINDOW函數的nCmdShow參數控制窗口顯示/隱藏。
其實這是我這個程序實現的不好的一個地方,如果在DLL窗口中使用Self.close方法會引起內存錯誤,實在能力有限沒有辦法解決,因此出此下策。所以每個DLL程序主窗口的關閉按鈕都必須隱藏掉。 :-P
5) DLL庫的釋放
在程序退出時,必須根據插件信息實例逐一釋放DLL庫。釋放DLL庫的函數如下:
procedure TFormHall.ClosePlugin(aPLG:TMyPlugins);
var
FreeDLLForm:TFreeDLLForm;
begin
if aPLG.ProcAddr = 0 then exit;
if aPLG.FuncFreeAddr = nil then exit;
@FreeDLLForm:=aPLG.FuncFreeAddr;
if not FreeDLLForm(Application.Handle,’’,’’) then
showMessage(’err’);
end;
小結
本實例程序運行效果如下:
我以上的方法中,因為有不少能力有限沒有解決的問題,所以采用了一些看起來不太合理的掩飾方法,希望大家能在做了一點嘗試後設計出更好的解決方法,我也希望能學到更多的好方法。