瞭解HHOOK之路( 二 )

DLL調用方式

 

DLL 的調用方式有顯示調用和隱式調用  通過調用 LoadLibrary AfxLoadLibrary 或 GetModuleHandle 加載DLL,用 GetProcAddress 獲得指定函數在DLL中的地址。具體的我也沒有弄清楚。接下來了解一下GetProcAddress 函數。

 

 

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. 獲得DLLSetWindowHookEx()中調用函數的地址以及DLL地址,在主程序中直接調用

@2. @1的基礎上有點違背類的含義。

 

隱式調用

 

隱式調用其實很簡單,核心的東西就一個:將編譯的DLL文件中.lib  .dll 以及 **.h 文件拷貝到調用的工程中,再在主程序中添加

**.h

#pragma comment( lib , "DLL" )

隱式調用就完成了。

 

接下來我將親自驗證幾個實例,與大家分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章