【问题标题】: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 - 它通过导入库链接,因此它必须存在。这只发生在少数几台机器上;在大多数情况下,它按预期运行。它似乎在等待;在延迟期间没有过度使用处理器。我不确定它在延迟期间做了什么,但我怀疑如果我能弄清楚我会解决问题。

标签: c++ dll visual-c++-6


【解决方案1】:

“在编译器生成代码以将 dll 附加到程序时会发生什么?”

几乎没有。编译器生成的代码存在于 DLL 中,而不是 EXE 中。它具有三个基本任务:确保加载 C++ 运行时、调用全局对象的构造函数以及调用 DllMain。请注意,生成代码的最后两部分仅调用 your 代码;生成的代码本身在纳秒内执行。

【讨论】:

    猜你喜欢
    • 2015-12-15
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2021-08-03
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多