【问题标题】:Calling any function from dll throws error从 dll 调用任何函数都会引发错误
【发布时间】:2020-11-15 11:09:45
【问题描述】:

我正在用编译成 dll 的 c++ 制作游戏引擎。在过去的两周里,我对代码进行了非常无聊的清理以使其更易于使用,不幸的是没有进行任何备份。现在,当我从可执行代码中的该 dll 调用任何函数时,它会显示错误窗口,当可执行文件启动时,它会告诉错误代码 0xc0000142。编译器没有显示任何可能导致这种情况的警告,没有链接错误,什么也没有。我不知道什么可以做到这一点。我正在使用链接器来链接 dll,而不是动态加载它。有谁知道什么会触发这个错误?

【问题讨论】:

  • {DLL 初始化失败}
  • 重建库并重试。
  • when i call any function from that dll it shows error window 你有没有将 DLL 设置为延迟加载?否则,错误更有可能发生在启动时而不是第一次调用时。
  • 可能是从 DLLMain() 返回的值错误。
  • @dvix 我忘了提到,当我将该 dll 中的任何函数添加到该应用程序时,错误发生在应用程序启动时,它在启动时会出错,因为如果我把 cout 放在第一位,它不会t 打印,只是崩溃

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


【解决方案1】:

如果不延迟加载,当你加载进程时,dll也会被带入内存。所以会发生这个错误。 如何应对? 我建议您只使用基本代码制作一个全新的普通可执行文件并插入此 dll。试试吧。 如果成功,请在非功能代码上插入函数调用(不应在启动时调用)并尝试。 如果上述成功,请尝试在功能代码上添加函数调用并尝试。 如果工作意味着简单的 DLL 是干净的。 那么你的原始 exe 会发生什么,很有可能将坏的 DLL 副本放在 PATH 中。它导致了错误。

如果中间出现任何故障,您可以从 DLL 中找出问题所在。在这种情况下,我建议您使用新的空白函数注释掉所有代码。接下来是 DllMain 方式。

对于“开放式”答案感到抱歉。但是对于调试,我认为您需要一些思考的指针。你是最终会找到结果的人。请发布调查结果。

【讨论】:

  • 所以我让普通可执行文件运行了它引发运行时错误的代码,Visual Studio 将我指向我的 dll 中的一个函数,我评论了该函数,编译了 dll,现在应用程序运行没有错误,现在我要看看该代码有什么问题。我希望我现在可以修复它,非常感谢!
  • 好的,我发现了问题。当 dll 启动时,它调用对象的构造函数。我不知道为什么没有人调用它时可以调用它。但后来我发现我有静态指针,它只是在“普通文件”中分配,导致错误,它可能是因为没有加载函数或什么?我不知道,但删除静态指针创建修复了一切。
  • 很高兴您分享了这一发现。任何读过这篇文章的人都可能发生这种情况。对于调试,人们需要指针。
  • 我再次查看了代码,指针初始化实际上并不是问题,问题是构造函数正在使用 nullptr,因为构造函数是在“普通文件”中调用的,所以它得到了在其他任何事情之前调用,因为我的引擎没有初始化,它没有加载需要的指针,这发生了
  • 不错的收获。应该避免使用全局变量的另一个原因。我建议您查看您的 DLL 函数 API。如果对该 API 的调用之间存在状态,请考虑让用户代码对其进行维护并将其作为参数传递给调用。通过这种方式,您可以避免 dll 中的全局变量,并且还可以让您在并发等方面获得价值。
【解决方案2】:

很好。异常的使用在诸如构造之类的场景中是很好的。当事情进展顺利时,它不会增加太多的性能开销。但是当讨厌的事情发生时很整洁。当你把代码交给别人维护时尤其好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 2012-05-27
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    相关资源
    最近更新 更多