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