C++ - 链接到第 3 方 DLL - 间歇性访问冲突

标签 c++ dll

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

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

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

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

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

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

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

最佳答案

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

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

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

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

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

关于C++ - 链接到第 3 方 DLL - 间歇性访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1035666/

相关文章:

c++ - 删除目录及其中的所有子目录

c++ - 通过 DEF 文件进行的 DLL 导出符号修改似乎已被修改

java - Windows下JVM如何绘制按钮等控件?

c++ - 警告 C4481 非标准扩展用于枚举 'MyEnum' 用于合格名称

c++ - 使用 VAO 和 VBO 在 3.2 中绘制 OpenGL 直线和正方形

c++ - 找不到可执行文件,请指定一个

在 LuaJIT FFI 中创建回调结构

c# - 在VBA中编译支持声明函数的dll

c++ - 函数参数求值顺序

c++ - 全局 bool 变量和模板