DLL調用方式
DLL 的調用方式有顯示調用和隱式調用 通過調用 LoadLibrary AfxLoadLibrary 或 GetModuleHandle 加載DLL,用 GetProcAddress 獲得指定函數在DLL中的地址。具體的我也沒有弄清楚。接下來了解一下GetProcAddress 函數。
顯式鏈接到 DLL 的進程調用 GetProcAddress 來獲取 DLL 導出函數的地址。 使用返回的函數指針調用 DLL 函數。
顯示調用
我在網上收集了兩段代碼實例:
實例一
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);
}
}
實例二
void CRegularDllCallDlg::OnCalldllButton()
{
typedef void (*lpFun)(void);
HINSTANCE hDll; //初始化一個DLL句柄
hDll = LoadLibrary("RegularDll.dll");
if (NULL==hDll)
{
MessageBox("DLL加載失敗");
}
lpFun addFun; //函數指針
lpFun pShowDlg = (lpFun)GetProcAddress(hDll,"ShowDlg");
if (NULL==pShowDlg)
{
MessageBox("DLL中函數尋找失敗");
}
pShowDlg();
}
通過實例,我有兩點想法:
@1. 獲得DLL中SetWindowHookEx()中調用函數的地址以及DLL地址,在主程序中直接調用
@2. 在@1的基礎上有點違背類的含義。
隱式調用
隱式調用其實很簡單,核心的東西就一個:將編譯的DLL文件中.lib .dll 以及 **.h 文件拷貝到調用的工程中,再在主程序中添加
**.h
#pragma comment( lib , "DLL名" );
隱式調用就完成了。
接下來我將親自驗證幾個實例,與大家分享。