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

时间:2009-06-23 22:47:04

标签: c++ dll

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

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

我可以想到间歇性失败的两个可能原因。

最有可能的是,DLL具有竞争条件。如果DLL已被缓存,则可能会暴露,导致时间发生变化。这可以解释为什么你的第一次运行没有失败,但随后的运行没有失败。

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

另外,在调试器中获取此信息。在visual studio中启用第一次机会异常并查看AV正在发生的callstack,并将其发布在此处。