【问题标题】:Find where dll is loaded from in C++ program (MFC)在 C++ 程序 (MFC) 中查找 dll 的加载位置
【发布时间】:2016-10-29 19:49:36
【问题描述】:

我有大型遗留 C++ 应用程序 (Visual Studio 2010),我需要在加载特定 dll 之前执行一些代码。问题是 dll 在我执行任何代码之前就被加载了,所以我试图找出是什么触发了它加载。

我在链接选项中为 dll 指定了 /DELAYLOAD,这应该会在需要之前停止 dll 加载。但是在我执行任何代码之前它仍然会被加载。应用程序是 MFC,所以我的入口点是 CWinApp::InitApplication() 的覆盖。

我怀疑它必须是引用 dll 中的类型的应用程序中的全局变量,但我不确定如何找到该变量(代码库很大,并且全局变量的命名不一致)。

任何想法如何找到触发 dll 加载的原因,或者如何找到全局变量?

【问题讨论】:

  • 查找LoadLibrary 调用,或者是否隐式加载#pragma comment (lib...) 行。
  • @PaulMcKenzie:OP 正在寻找在任何用户代码运行之前加载的 DLL。 CWinApp::InitApplication 是 C 的 main 的道德等价物。 OP 不是在寻找明确的 LoadLibrary 调用,也不是在寻找链接器指令(他们已经知道,库已链接)。他们正在寻找延迟加载库加载的原因,尽管似乎还没有触及导出。
  • 您可以覆盖延迟加载辅助函数,并检查哪些符号触发DLL 加载。见msdn.microsoft.com/en-us/library/09t6x5ds(v=vs.100).aspx
  • @dxiv 是的,明白了。实际上,我在正确覆盖延迟加载器时遇到了麻烦,但是发现您可以在默认的断点中放置一个断点... delayhlp.cpp 中的 __delayLoadHelper2() 。我这样做了,它确定了一个全局单例,其初始化程序引用了 dll 中的一个类型。如果你想把它作为一个完整的回应,我会接受它。
  • 很好,它成功了。我的只是一个提示,事实上我更喜欢你的答案。

标签: c++ visual-studio-2010 dll mfc


【解决方案1】:

我通过在delay-load helper 函数__delayLoadHelper2 上设置断点解决了这个问题。这个函数可以在:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\delayhlp.cpp

在加载标记为延迟加载的 dll 时调用它。

我在__delayLoadHelper2 中设置了断点,并在调用堆栈被命中时查看了它。这显示了我的代码中触发 dll 加载的函数。

它是由一个全局单例构造函数触发的,它从 dll 中创建了一个类型。此代码在CWinApp::InitApplication() 之前执行。

【讨论】:

  • 我不明白,调试器如何将目标代码映射到源代码(delayhlp.cpp)。我找不到 Visual Studio 附带的匹配 .pdb 文件。您是否知道,它是如何(以及为什么)起作用的?
  • @IInspectable Delayhlp.cpp 使用(引用源文件)Build instructions: cl -c -O1 -Z7 -Zl -W3 delayhlp.cpp 编译。 /Z7 表示调试信息包含在目标文件中,并依次进入程序链接的delayimp.lib。来自Debug Information FormatTo create a library that contains debugging information without using .pdb files, you must select the compiler's C 7.0-Compatible (/Z7) option
  • @dxiv:完美!微软的编译器普遍用于分离调试信息和目标代码,我什至没有想到你可以在最终的可执行模块中嵌入调试信息。为 delayimp.lib 执行此操作是一个很棒的应用程序,可以调试开箱即用的延迟加载。有时我对细节的关注给我留下了深刻的印象,这真的弥补了所有其他时候,当我不...
  • 这对我有用,尽管我不得不将它试图加载的 dll 放在同一个目录中。如果找不到 dll,它似乎永远无法使用此功能。
猜你喜欢
  • 1970-01-01
  • 2011-08-12
  • 2020-10-16
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多