2016-08-12 18 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; 
} 
相关问题