在执行任何程序代码之前,通过静态 .lib 链接到 dll 的程序会发生啥?
Posted
技术标签:
【中文标题】在执行任何程序代码之前,通过静态 .lib 链接到 dll 的程序会发生啥?【英文标题】:What happens in a program that is linked to a dll through a static .lib before any of the program code is executed?在执行任何程序代码之前,通过静态 .lib 链接到 dll 的程序会发生什么? 【发布时间】:2017-01-31 21:29:33 【问题描述】:这是一个复杂的情况。在执行任何程序或 dll 代码之前,exe 加载延迟大约 10 分钟。程序和 dll 都是内部编写的。使用较早版本的 dll 似乎可以缓解该问题。我试图确定的是编译器生成的代码中会发生什么以将 dll 附加到程序以及如何导致加载程序时延迟几分钟。该程序和 dll 都是使用 VC++ 6.0 生成的。这在大约 1 年前的 dll 修订之后开始发生,但修订与任何 dll 初始化/启动代码无关。这不会发生在所有计算机上,也不会影响在任何给定计算机上使用 dll 的所有程序。失败似乎没有任何规律。
【问题讨论】:
应用程序和/或 DLL 在启动时可以做很多事情,例如在DllInitialize()
或任何全局/静态对象的构造函数中 - 检查这些。您可以将一些日志记录放在main()
的开头(或MessageBox()
在WinMain
的开头),以查看 main 实际何时开始。
那么在这 10 分钟内(调用 dll 代码时)会发生什么?应用程序被冻结了吗?或者它正在做其他事情?你是如何测试的(在DllMain
中添加了一些代码)? dll是否链接到应用程序(如果dll不存在,应用程序将无法启动),还是通过LoadLibrary
加载,还是delay loaded?
标题相当混乱。 static .lib 意味着您不链接到 DLL。使用 DLL 时,您将使用 import .lib.
@axalis - 它们是 MFC 项目;我无权访问这些方法/函数,否则我会这样做。
@ CristiFati - 它通过导入库链接,因此它必须存在。这只发生在少数几台机器上;在大多数情况下,它按预期运行。它似乎在等待;在延迟期间没有过度使用处理器。我不确定它在延迟期间做了什么,但我怀疑如果我能弄清楚我会解决问题。
【参考方案1】:
“在编译器生成代码以将 dll 附加到程序时会发生什么?”
几乎没有。编译器生成的代码存在于 DLL 中,而不是 EXE 中。它具有三个基本任务:确保加载 C++ 运行时、调用全局对象的构造函数以及调用 DllMain
。请注意,生成代码的最后两部分仅调用 your 代码;生成的代码本身在纳秒内执行。
【讨论】:
以上是关于在执行任何程序代码之前,通过静态 .lib 链接到 dll 的程序会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章