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

时间:2012-04-02 16:10:57

标签: c++ visual-c++ dll msvcr90.dll

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

  

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

2 个答案:

答案 0 :(得分:5)

在这种情况下,

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

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

我的意思是:附加调试器并查看场景下发生的事情!

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

答案 1 :(得分:3)

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

  1. 构建一个暴露纯C接口的DLL。您可以在DLL中使用C ++ ,但公共接口必须是纯C(因此,例如,您不能抛出跨越DLL边界的异常)。
  2. 构建 COM DLL(可能借助ATL等工具)。
  3. 使用类似COM的技术构建DLL,即仅从您的DLL中公开抽象接口和工厂函数(此技术在CodeProject {{3 },特别是在段落"HowTo: Export C++ classes from a DLL")中。
  4. 指出"C++ Mature Approach: Using an Abstract Interface"

    也很重要