我用 VC++ 2008 制作了一个 DLL,当我在控制台应用程序 VC++ 6.0 中使用它时,有一个例外:
(msvcr90.dll): 0xc0000005: 访问冲突
我用 VC++ 2008 制作了一个 DLL,当我在控制台应用程序 VC++ 6.0 中使用它时,有一个例外:
(msvcr90.dll): 0xc0000005: 访问冲突
Access Violation
在这种情况下可能意味着很多事情,并且msvcr90.dll
参考可能会产生很大的误导。如果您将无效数据传递给任何 MSVC 标准库函数,则访问冲突将发生在您的代码中msvcr90.dll
而不是在您的代码中(查看堆栈跟踪或查看异常信息时)。
也就是说,理论上,在 VC++ 6 中使用 VC9 DLL 不应该有问题,因为 ABI 没有改变并且 PE 格式是相同的。如果在您的平台上不受支持,您可能会遇到问题msvcrt9.dll
(例如,如果您在 Windows NT 上运行 MSVC6),否则意味着您需要检查您的代码。
我的意思是:附加一个调试器,看看场景下面发生了什么!
另一个注意事项:当动态使用不同版本的 MSVC 库时,您不得在一个库中分配数据并在另一个库中释放它,因为它们不能保证使用相同的堆,并且您可能会Access Violation
相当容易地获得内存损坏(和错误)像这样。这也意味着,如果您正在编写 C++,则不能创建一个对象,然后将其通过返回值传递给调用应用程序,因为这将在幕后发生。
如果你想用 Visual C++ 版本X构建一个 DLL 并在 Visual C++ 版本Y中使用它,你有一些选择:
同样重要的是要指出分配内存的代码和释放内存的代码必须使用相同的分配器。