我可以用VC++2008创建Dll并在VC++6中使用它吗



我用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中使用它,你有一些选项:

  1. 构建一个DLL,该DLL公开纯C接口。您可以在DLL内部使用C++,但公共接口必须是纯C(例如,您不能跨越DLL边界抛出异常)
  2. 构建COMDLL(可能借助ATL等工具)
  3. 使用COM类技术构建DLL,即仅从DLL中公开抽象接口和工厂函数(这项技术在CodeProject"HowTo:从DLL导出C++类"的文章中有解释,特别是在"C++成熟方法:使用抽象接口"一段中)

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

相关内容

最新更新