【问题标题】:C++ - linking to 3rd party DLL - intermittent access violationC++ - 链接到第 3 方 DLL - 间歇性访问冲突
【发布时间】:2009-06-23 22:47:03
【问题描述】:

我已经获得了一个 C++ DLL 和相关的头文件,以便将它与我的应用程序集成。首先,我只是想从一个简单的 Win32 控制台应用程序(我使用 Visual Studio 2008 Express)调用 DLL。

我已通过在项目设置中将 DLL 指定为附加依赖项来链接该 DLL。

接口(即唯一导出的函数)只是返回一个指向我实际需要调用的类的实例的指针。我可以成功调用它,获取指针并调用我需要的第一个函数(“init”函数)。

当我调用实际执行所需处理的函数时,我间歇性地收到“0xC0000005:访问冲突读取位置......”错误。也就是说,我运行程序 - 它成功运行并退出 - 我尝试再次运行它(什么都不改变 - 所有参数都是硬编码的)并得到错误(并继续这样做)。

我无法始终如一地重现该问题,但我开始认为这可能与 DLL 未正确卸载有关 - 有一次出现错误后,我尝试删除 DLL 并被 Windows 告知它正在使用中。也就是说,在另一个情况下,我能够在收到错误后删除 DLL,将其复制回来,然后在下次运行时仍然收到错误。

我的 .exe 完成后是否应该正确卸载 DLL?尝试显式加载/卸载 DLL 而不是隐式执行会更好吗?

非常感谢任何其他帮助或建议。

【问题讨论】:

  • 这是一个非常笼统的问题 - 您可以发布任何类型的代码或文档吗?
  • 调试器会出现这种情况吗?或者更确切地说,当它发生时,为什么不附加一个调试器并查看调用堆栈?

标签: c++ dll


【解决方案1】:

它与正在卸载的 DLL 没有任何关系;使用同一个 DLL 的不同进程不共享任何状态。此外,当进程退出时,DLL 将被卸载;也许不优雅,但它会被卸载。

我可以想到两个可能导致间歇性故障的原因。

很可能,DLL 存在竞争条件。如果 DLL 已被缓存,这可能会暴露出来,从而导致时间发生变化。这可以解释为什么您的第一次运行没有失败,但随后的运行失败了。

我认为 DLL 也有可能没有释放对某个文件的锁定。如果您知道该 DLL 访问了某个文件,请尝试在进程结束后检查该文件是否被锁定。

另外,在调试器中获取它。在 Visual Studio 中打开第一次机会异常并查看发生 AV 的调用堆栈,并在此处发布。

【讨论】:

  • 调用堆栈显示:“my.exe!wmain(int argc=1, wchar_t * * argv=0x00981ad0) Line 96 + 0xed bytes C++”。考虑到我正在调用我实际上没有源代码的代码,我认为调用堆栈并不会真正给我太多帮助?
【解决方案2】:

DLL 导出的类中涉及哪些类型?当类使用 STL 时,我们经常在 Visual Studio 中遇到这类问题——我猜任何模板的使用都可能是导致这类问题的一种方式。

【讨论】:

    【解决方案3】:

    您对配置属性中“C/C++”下的“运行时库”的设置是什么?
    您可能应该尝试 /MD(或 /MDd 进行调试)。
    http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspx

    【讨论】:

    • 谢谢。刚启动我的工作笔记本电脑来看看。它是/MTd。我将其更改为 /MD 并重建。然后我连续成功运行了3次程序,认为问题已经解决了。然后在第四次我再次遇到访问冲突!
    猜你喜欢
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多