動態鏈接庫(Dynamic Link Library),簡稱DLL。DLL 是一個包含可由多個程序同時使用的代碼和數據的庫。它允許程序共享執行特殊任務所必需的代碼和其他資源,一般來說,DLL是一種磁盤文件,以.dll、.DRV、.FON、.SYS和許多以.EXE為擴展名的系統文件都可以是DLL。它由全局數據、服務函數和資源組成,在運行時被系統加載到調用進程的虛擬空間中,成為調用進程的一部分。DLL的調用可以分為兩種:一種是隱式調用,一種是顯示調用 這里簡單分享DLL的兩種調用方法。
隱式的調用
這種調用方式需要把產生動態連接庫時產生的.LIB文件加入到應用程序的工程中,在使用DLL中的函數時,只須說明一下后就可以直接通過函數名調用DLL的輸出函數,調用方法和程序內部其他的函數是一樣的。隱式調用不需要調用LoadLibrary()和FreeLibrary()。程序員在建立一個DLL文件時,鏈接程序會自動生成一個與之對應的LIB導入文件。該文件包含了每一個DLL導出函數的符號名和可選的標識號,但是並不含有實際的代碼。LIB文件作為DLL的替代文件被編譯到應用程序項目中。
當程序員通過隱式調用方式編譯生成應用程序時,應用程序中的調用函數與LIB文件中導出符號相匹配,這些符號或標識號被寫入到生成的EXE文件中。LIB文件中也包含了對應的DLL文件名(但不是完全的路徑名),鏈接程序也將其存儲在EXE文件內部。當應用程序運行過程中需要加載DLL文件時,Windows根據這些信息發現並加載DLL,然后通過符號名或標識號實現對DLL函數的動態鏈接。所有被應用程序調用的DLL文件都會在應用程序EXE文件加載時被加載在到內存中。
顯式調用
這種調用方式是指在應用程序中用LoadLibrary或MFC提供的AfxLoadLibrary顯式的將自己所做的動態連接庫調進來,並指定DLL的路徑作為參數。LoadLibary返回HINSTANCE參數,應用程序在調用GetProcAddress函數時使用這一參數。當完成對動態鏈接庫的導入以后,再使用GetProcAddress()獲取想要引入的函數,該函數將符號名或標識號轉換為DLL內部的地址,之后就可以象使用本應用程序自定義的函數一樣來調用此引入函數了。在應用程序退出之前,應該用FreeLibrary或MFC提供的AfxFreeLibrary釋放動態連接庫。
在主程序使用動態庫中的類的方法:
首先定義函數指針類型
typedef MyClass* (*CreateMyClass)();
在主函數中:
//先LoadLibrary讀取DLL庫
HINSTANCE hInstance = LoadLibrary("MyDll.dll");
//用普通的GetProcAddress方法取得Create函數的地址;
CreateMyClass createMC =
(CreateMyClass)(GetProcAddress(hInstance,
MAKEINTRESOURCE(1)));
//然后用Create函數創建對象
MyClass *d = createMC();
//下面就可以使用該對象了。
d->init();
d->print();
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT); ... HINSTANCE hDLL; // Handle to DLL LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer DWORD dwParam1; UINT uParam2, uReturnVal; hDLL = LoadLibrary("MyDLL"); if (hDLL != NULL) { lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "DLLFunc1"); if (!lpfnDllFunc1) { // handle the error FreeLibrary(hDLL); return SOME_ERROR_CODE; } else { // call the function uReturnVal = lpfnDllFunc1(dwParam1, uParam2); } }