【发布时间】: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