【问题标题】:Checking if a WIN32 / Unmanaged DLL is loaded from a COM module on runtime检查是否在运行时从 COM 模块加载了 WIN32/非托管 DLL
【发布时间】:2016-12-19 05:28:18
【问题描述】:

我想检查是否已经从 COM 模块加载了本机 dll?我的目的是检查是否加载了适当的 DLL,以便我可以在其上调用相应的方法。我提到了链接“https://msdn.microsoft.com/en-us/library/system.appdomain.getassemblies.aspx”,但它没有帮助。我的本机模块在调试期间也没有显示在 Visual Studio 的已加载模块列表窗口中,但是在我设置“启用本机代码调试”时显示?有没有办法通过代码实现同样的效果?

【问题讨论】:

    标签: c# c++ winapi dll com


    【解决方案1】:

    调用GetModuleHandle 传递模块的名称。如果在您的进程中加载​​了模块,则返回一个非空值。

    【讨论】:

    • 非常感谢。它帮助了我。 :)
    • 这个 API 调用实际上是在为 TOCTOU 竞争条件设置自己。另一方面,GetModuleHandleEx 能够执行相同的检查,但通过增加其引用计数将模块锁定到内存中。然后,返回的句柄可以安全地用于对 GetProcAddress 的后续调用。
    • @IInspectable:很好,但考虑到 COM 的设计,这可能不是必需的。 DllCanUnloadNow (...) 用于确定是否保留任何引用。获取引用应该是保持模块存活所必需的。
    【解决方案2】:

    我找到了解决我的问题的方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 2011-04-21
      • 2020-05-13
      相关资源
      最近更新 更多