1

我用 VC++ 2008 制作了一个 DLL,当我在控制台应用程序 VC++ 6.0 中使用它时,有一个例外:

(msvcr90.dll): 0xc0000005: 访问冲突

4

2 回答 2

5

Access Violation在这种情况下可能意味着很多事情,并且msvcr90.dll参考可能会产生很大的误导。如果您将无效数据传递给任何 MSVC 标准库函数,则访问冲突将发生在您的代码中msvcr90.dll而不是在您的代码中(查看堆栈跟踪或查看异常信息时)。

也就是说,理论上,在 VC++ 6 中使用 VC9 DLL 不应该有问题,因为 ABI 没有改变并且 PE 格式是相同的。如果在您的平台上不受支持,您可能会遇到问题msvcrt9.dll(例如,如果您在 Windows NT 上运行 MSVC6),否则意味着您需要检查您的代码。

我的意思是:附加一个调试器,看看场景下面发生了什么!

另一个注意事项:当动态使用不同版本的 MSVC 库时,您不得在一个库中分配数据并在另一个库中释放它,因为它们不能保证使用相同的堆,并且您可能会Access Violation相当容易地获得内存损坏(和错误)像这样。这也意味着,如果您正在编写 C++,则不能创建一个对象,然后将其通过返回值传递给调用应用程序,因为这将在幕后发生。

于 2012-04-02T16:50:07.630 回答
3

如果你想用 Visual C++ 版本X构建一个 DLL 并在 Visual C++ 版本Y中使用它,你有一些选择:

  1. 构建一个公开纯 C 接口的 DLL 。您可以在DLL中使用 C++ ,但公共接口必须是纯 C(例如,您不能抛出跨 DLL 边界的异常)。
  2. 构建一个COM DLL(可能借助 ATL 等工具)。
  3. 使用类似 COM 的技术构建 DLL ,即仅从您的 DLL 中公开抽象接口和工厂函数(此技术在 CodeProject “HowTo: Export C++ classes from a DLL”的这篇文章中进行了解释,特别是在“C++ Mature Approach”段落中:使用抽象接口”)。

同样重要的是要指出分配内存的代码和释放内存的代码必须使用相同的分配器

于 2012-04-02T22:24:44.903 回答