2、載入DLL庫文件
通過調用API函數LoadLibrary可以將DLL庫載入到內存中,在此我們不討論DLL對內存管理的影響。LoadLibrary的參數是DLL文件的地址路徑,如果載入成功會返回一個CARDINAL類型的變量作為DLL庫的句柄;如果目標文件不存在或其他原因導致載入DLL文件失敗會返回一個0。
3、實例化接口函數
獲得接口函數指針的API函數為GetProcAddress(庫文件句柄,函數名稱),如果找到函數則會返回該函數的指針,如果失敗則返回NIL。
使用上文定義的函數類型定義函數指針變量,然後使用@操作符獲得函數地址,這樣就可以使用指針變量訪問函數。主要代碼如下:
……
var
ShowDLLForm: TShowDLLForm; //DLL接口函數實例
FreeDLLForm: TFreeDLLForm;
begin
try
begin
APlugin.ProcAddr := LoadLibrary(PChar(sPath));
APlugin.FuncFreeAddr := GetProcAddress(APlugin.ProcAddr,’FreeDLLForm’);
APlugin.FuncAddr := GetProcAddress(APlugin.ProcAddr ,’ShowDLLForm’);
@ShowDLLForm:=APlugin.FuncAddr ;
@FreeDLLForm:=APlugin.FuncFreeAddr;
if ShowDllForm(Self.Handle, APlugin.Caption , APlugin.UserID) then
Result:=True
……
4、一個具體的實現方法
為了結構化管理插件,方便今後的系統擴充,我們可以結合數據庫記錄可用的DLL信息,然後通過查詢數據庫記錄動態訪問DLL程序。
1) 系統模塊表設計
對於MIS系統,可以利用已有的DBS條件建立一個系統模塊表,記錄DLL文件及映射到系統模塊中的相關信息
字段名 作用 類型 AutoID 索引 INT modAlias 模塊別稱 VARCHAR modName 模塊名稱 VARCHAR modWndClass 窗體唯一標識 VARCHAR modFile DLL路徑 VARCHAR modMemo 備注 TEXT·模塊別稱是用來在編程設計階段統一命名的規則,特別是團隊開發時可以供隊員參考。
·模塊名稱將作為ACAPTION參數傳遞給SHOWDLLFORM函數作為DLL窗口的標題。
·窗體唯一標識是DLL子模塊中主窗口的CLASSNAME,用來在運行時確定要控制的窗口。
·DLL路徑保存DLL文件名稱,程序中將轉換為絕對路徑。