【Windows API學習】GetProcAddress學習

來源:互聯網
上載者:User

顯式連結到 DLL 的進程調用 GetProcAddress 來擷取
DLL 匯出函數的地址。 使用返回的函數指標調用 DLL 函數。 GetProcAddress 將(由 LoadLibrary、AfxLoadLibrary 或GetModuleHandle 返回的)DLL
模組控制代碼和要調用的函數名或函數的匯出序號用作參數。

由於是通過指標調用 DLL 函數並且沒有編譯時間類型檢查,需確保函數的參數是正確的,以便不會超出在堆棧上分配的記憶體和不會導致存取違規。 協助提供型別安全的一種方法是查看匯出函數的函數原型,並建立函數指標的匹配
typedef。 例如:

typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);...HINSTANCE hDLL;               // Handle to DLLLPFNDLLFUNC1 lpfnDllFunc1;    // Function pointerDWORD 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);   }}

調用 GetProcAddress 時指定所需函數的方式取決於
DLL 的產生方式。

僅當要連結到的 DLL 是用模組定義 (.def) 檔案產生的,並且序號在 DLL 的 .def 檔案的 EXPORTS 部分中與函數一起列出時,才能擷取匯出序號。 如果
DLL 具有許多匯出函數,則相對於使用函數名,使用匯出序號調用 GetProcAddress 的速度稍快一些,因為匯出序號是 DLL 匯出表的索引。 使用匯出序號,GetProcAddress 可直接定位函數,而不是將指定名稱與
DLL 匯出表中的函數名進行比較。 但是,僅當有權控制 .def 檔案中匯出函數的序號分配時,才應使用匯出序號調用 GetProcAddress。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.