2008-09-23 114 views
13

可能重複:
How do I get the HMODULE for the currently executing code?如何獲取我自己的代碼模塊句柄?

我試圖找到我自己的模塊的資源。如果這個模塊是一個可執行文件,那很簡單 - GetModuleHandle(NULL)返回「main」模塊的句柄。

但是,我的模塊是由另一個可執行文件加載的DLL。因此GetModuleHandle(NULL)會將模塊句柄返回給該可執行文件,這顯然不是我想要的。

有什麼方法可以確定包含當前運行代碼的模塊的模塊句柄嗎?在對GetModuleHandle()的調用中使用DLL的名稱對我來說似乎是一種攻擊(並且在將代碼移植到不同的DLL中時不易維護)。

回答

10

當它在DllMain中提供給您時,將模塊句柄保存起來,然後在實際需要時使用它。很多框架(例如MFC)會自動執行此操作。

+0

請您提供有關此解決方案的更多細節?作爲線程的作者,我遇到了同樣的問題,但是我不知道DllMain是什麼,它何時被調用,以及如何存儲我需要的信息。 – 2017-04-27 13:12:49

+0

@MarcinK。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx - 這解釋了什麼是DllMain。它是模塊的一個可選入口點,您可以創建並執行諸如將模塊句柄存儲在全局變量中的操作。 – 2017-05-01 07:19:04

1

如前所述,這可以通過保存傳遞給DllMain函數的模塊句柄來完成。

但還有其他一些原因,你應該保存手柄。

例如,如果您決定使用資源鏈接程序將資源綁定到DLL,則需要使用此模塊句柄通過函數API獲取這些資源。

5

如果DLL與MFC鏈接那麼有一種方式來獲得DLL的實例中,一些功能被稱爲:

void dll_function() 
    { 
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
    HINSTANCE dll_instance = AfxGetInstanceHandle(); 
    }