Windows API一日一練(82)LoadLibrary函數
隨著軟體規模的擴大,要求的功能也是越來越多,開發人員的參與也是越來越多。因此軟體的功能劃分,就成為了現代軟體工程的重大任務,還有軟體開發的並行性也越來越重要。為瞭解決這些問題,大家都會看到IT硬體發展非常迅速,功能也越來越複雜,但硬體中發展明顯提高在於採用IC的方式來實現複雜的功能,也就是把大部份功能整合到一起,只要給出一些引腳就可以實現產品了。而軟體中有沒有相同於硬體中的IC呢?我想是應有的,就是動態串連庫了。在Windows這座大廈裡,很多基石就是動態串連庫構成的。一個動態串連庫就封裝了特別複雜的功能,使用者不必關心它是怎麼樣實現的。當然,這樣也可以讓不同的開發人員同時開發產品,提高軟體開發的速度。要使用動態串連庫裡的函數,就需要使用LoadLibrary函數來載入動態串連庫,使用函數GetProcAddress來擷取功能函數的地址。
函數LoadLibrary聲明如下:
WINBASEAPI
__out
HMODULE
WINAPI
LoadLibraryA(
__in LPCSTR lpLibFileName
);
WINBASEAPI
__out
HMODULE
WINAPI
LoadLibraryW(
__in LPCWSTR lpLibFileName
);
#ifdef UNICODE
#define LoadLibrary LoadLibraryW
#else
#define LoadLibrary LoadLibraryA
#endif // !UNICODE
lpLibFileName是動態串連庫的名稱。
調用函數的例子如下:
#001 //載入動態串連庫。
#002 //蔡軍生 2007/12/03 QQ:9073204 深圳
#003 void TestLoadDLL(void)
#004 {
#005 //載入動態串連庫。
#006 HMODULE hDllLib = LoadLibrary(_T("Kernel32.dll"));
#007 if (hDllLib)
#008 {
#009 //擷取動態串連庫裡的函數地址。
#010 FARPROC fpFun = GetProcAddress(hDllLib,"GetVersion");
#011
#012 //調用函數運行。
#013 DWORD dwVersion = (*fpFun)();
#014
#015 //擷取WINDOWS的版本。
#016 DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
#017 DWORD dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
#018
#019 //顯示。
#020 const int nBufSize = 512;
#021 TCHAR chBuf[nBufSize];
#022 ZeroMemory(chBuf,nBufSize);
#023
#024 wsprintf(chBuf,_T("顯示版本:%d,%d/r/n"),
#025 dwWindowsMajorVersion,dwWindowsMinorVersion);
#026 OutputDebugString(chBuf);
#027
#028 //釋放動態串連庫。
#029 FreeLibrary(hDllLib);
#030 }
#031
#032 }