2016-08-12 17 views
0

我想檢查一個本機DLL是否已經從COM模塊加載?我的目的是檢查是否加載了合適的DLL,以便我可以調用相應的方法。我提到鏈接「https://msdn.microsoft.com/en-us/library/system.appdomain.getassemblies.aspx」但它沒有幫助。在調試過程中,我的本地模塊也沒有顯示在Visual Studio的Loaded Module列表窗口中,但是當我設置「Enable native code debugging」時顯示它?有沒有通過代碼實現相同的方法?檢查運行時是否從COM模塊加載了WIN32/Unmanaged DLL

回答

2

致電GetModuleHandle傳遞模塊的名稱。如果模塊在您的過程中加載,則返回非空值。

+0

非常感謝你。它幫助了我。 :) –

+2

這個API調用確實爲[TOCTOU](https://en.wikipedia.org/wiki/Time_of_check_to_time_of_use)爭用條件設置了自己。另一方面,[GetModuleHandleEx](https://msdn.microsoft.com/en-us/library/windows/desktop/ms683200.aspx)能夠執行相同的檢查,但通過增加將模塊鎖定到內存中其裁判計數。然後可以安全地在隨後調用[GetProcAddress](https://msdn.microsoft.com/en-us/library/windows/desktop/ms683212.aspx)時使用返回的句柄。 – IInspectable

+0

@IInspectable:極好的一點,儘管COM的設計可能沒有必要。 ['DllCanUnloadNow(...)'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms690368%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396)用於確定是否保留任何引用。獲取參考應該是保持模塊有效所需的全部參數。 –

0

我發現這樣一個解決我的問題:

private bool IsNativDllLoaded(string dllName) 
{ 
    IntPtr module = GetModuleHandle(dllName); 
    return module != IntPtr.Zero; 
} 
相關問題