【问题标题】:How to get my own code's module handle? [duplicate]如何获取我自己代码的模块句柄? [复制]
【发布时间】:2010-09-12 07:01:48
【问题描述】:

可能重复:
How do I get the HMODULE for the currently executing code?

我正在尝试在我自己的模块中查找资源。如果这个模块是一个可执行文件,这很简单——GetModuleHandle(NULL) 返回“主”模块的句柄。

然而,我的模块是由另一个可执行文件加载的 DLL。所以GetModuleHandle(NULL) 会将模块句柄返回给那个可执行文件,这显然不是我想要的。

有没有办法确定包含当前运行代码的模块的模块句柄?在对 GetModuleHandle() 的调用中使用 DLL 的名称对我来说似乎是一种 hack(如果有问题的代码被移植到不同的 DLL 中,则不容易维护)。

【问题讨论】:

    标签: winapi dll


    【解决方案1】:

    在 DllMain 中将模块句柄提供给您时将其存储起来,然后在您实际需要时使用它。许多框架(例如 MFC)会自动执行此操作。

    【讨论】:

    • 您能否提供有关此解决方案的更多详细信息?我遇到了与线程作者相同的问题,但我不知道 DllMain 是什么,何时调用以及如何存储我需要的信息。
    • @MarcinK。 msdn.microsoft.com/en-us/library/windows/desktop/… - 这解释了什么是 DllMain。它是模块的一个可选入口点,您可以创建它并执行诸如将模块句柄存储在全局变量中之类的操作。
    【解决方案2】:

    如果 DLL 与 MFC 链接,那么有一种方法可以获取调用某些函数的 DLL 实例:

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

    【讨论】:

    • 感谢您的建议。对于 MFC DLL,这是一个很好的解决方案。但是我大约有一半的 DLL 不是,所以我还需要其他东西。我还没有查看 MFC 源代码,但是当 DLL 加载时,它们可能也在存储句柄。
    【解决方案3】:

    如前所述,这可以通过保存传入 DllMain 函数的模块句柄来完成。

    但还有其他原因需要您保存句柄。

    例如,如果您决定使用资源链接器将资源绑定到 DLL,则需要此模块句柄才能通过 LoadResource 函数 API 获取这些资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      相关资源
      最近更新 更多