【问题标题】:Why would a program crash in DllMain() when linking Xinput.lib为什么链接 Xinput.lib 时程序会在 DllMain() 中崩溃
【发布时间】:2022-01-08 07:22:59
【问题描述】:

我创建了一个输入库并与 xinput.lib 链接。在执行任何用户代码之前,使用我的输入库的程序在启动时崩溃,因此很难调试。该程序在 xinput dll 加载期间崩溃,这似乎发生在我的库的生成 dllmain 函数中。崩溃时我得到的错误是“xinput:一个无效参数被传递给了一个认为无效参数错误的函数”。如果我在我的输入库中添加一个空的 dllmain 函数,一切都会正常工作并且不会崩溃。不存在 dllmain 函数时可能导致崩溃的原因。似乎这是某种形式的损坏,与 xinput 无关。然而,在崩溃之前没有执行任何用户代码,所以我对它可能是什么感到迷茫。有什么想法吗?我在 Windows 11 上,我正在使用带有 clang-cl 工具链的 Visual Studio 2022。我还想指出,当我使用 VS 2019 和 Windows 10 时,这从来都不是问题。这可能是新工具链或操作系统的问题吗?谢谢。

编辑 1:

当我的库中没有 dllmain 时,堆栈跟踪如下所示:

当我在我的库中取消注释那个空的 DllMain 时,没有崩溃并且一切正常。没有任何意义,因为 DllMain 什么都不做。

编辑 2:

我可以确认这种完全相同的行为适用于链接到 Xinput.lib 的完整空项目。具有简单 main() 函数的准系统控制台应用程序,该函数从引用 Xinput.lib 的空白库中调用函数

【问题讨论】:

  • "...生成我的库的 dllmain 函数..."我们可以看看这个吗?
  • 正如理查德所说,我们需要查看您的 DllMain。但是,from the docs您可以在 DLL 入口点安全地执行的操作有很大的限制...
  • 我的 dllmain 函数不存在。我没有创建一个。只有当我添加一个并使其为空时,我的程序才不再崩溃。当我的库没有 dllmain 函数时调用堆栈崩溃时,我将显示调用堆栈的屏幕截图

标签: c++ windows dll linker xinput


【解决方案1】:

我可以确认这一定是最新的 clang-cl 工具链中的一个错误(它在大约 2 年前我正忙于这个项目时工作)。使用 msvc 工具链后,一切正常。我将使用 Microsoft Visual Studio 提交错误报告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-04
    • 2017-04-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多