[Windows編程] 通過GetModuleHandleEx 得到函數調用者所在的DLL/EXE

來源:互聯網
上載者:User

在有些情況下需要得到函數調用者的模組名字。比如你想限制你的某個函數只能被自己某個特定的DLL調用。 或者比如在異常處理中你想瞭解是那個DLL/EXE拋出了異常。

 

API函數_ReturnAddressGetModuleHandleEx 函數可以協助我們達到這個目的。以下代碼示範它們的用法:

 

 void ShowCallerModuleName()<br />{<br />HMODULE hCallerModule = NULL;<br /> TCHAR szModuleName[MAX_PATH] = _T("");<br />void *callerAddress = _ReturnAddress();<br /> if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)callerAddress, &hCallerModule))<br />{<br />GetModuleFileName(hCallerModule, szModuleName, ARRAYSIZE(szModuleName));<br />MessageBox(NULL, szModuleName, _T("Who is calling me?"), MB_OK);<br />}<br />}

 

解釋:

_ReturnAddress 可以給你所在函數的返回地址,也就是調用者的地址。

GetModuleHandleEx 可以給你某個地址所在的模組Handle 。 得到這個Handle 之後,就可以用GetModuleFileName 來得到模組的檔案名稱了。

 

如上面提到的,我們可以用這個方法來捕捉是哪個DLL/EXE拋出異常。 在程式入口加入

 

SetUnhandledExceptionFilter(ShowCallerModuleName);</p><p>

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.