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

问题描述:

我已经做了DLL与VC++ 2008年,当我在控制台应用程序中使用VC++ 6.0,有一个例外:我可以使用VC++ 2008创建DLL并在VC++ 6中使用它吗?

(MSVCR90.DLL):0000005:访问冲突

+0

我从来没有尝试过,但如果我猜测那么我认为我们不能,因为即使我们在VS2008和VS2006中编写C++程序的方式有很多差异,例如2006年,我们的头文件带有.h扩展名,但不是但主要问题是为什么你想从2008年到2006年? – 2012-04-02 16:18:50

+1

也许,也许不是。如果您在设计界面时确实非常小心,那肯定是可以的。但在一般情况下 - 不,它不会起作用。 – 2012-04-02 16:22:34

+0

该DLL是非托管代码。 – 2012-04-02 16:28:58

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

也就是说,从理论上讲,在VC++ 6中使用VC9 DLL是一个问题,因为ABI没有改变,PE格式也是一样的。如果您的平台上不支持msvcrt9.dll(例如,如果您在Windows上运行MSVC6 NT),但除此之外,它意味着你需要检查你的代码

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

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

+0

谢谢马哈茂德,你的笔记真的帮了我。我发送和接收文本到Dll函数作为一个std ::字符串,当我发送和接收它为char *问题解决。 – 2012-04-02 19:02:38

+0

这几乎总是最大的罪魁祸首。很高兴我能帮上忙。 – 2012-04-02 19:37:40

+0

马哈茂德,再次抱歉,我需要一些帮助。我发送文本到我的DLL并接收它为char *,有一个奇怪的事情发生,如果文本少于13个字符或超过77个字符返回的文本是垃圾! – 2012-04-03 10:06:26

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

  1. 建立它公开了一个纯C接口DLL。你可以在里面使用C++ 这个DLL,但是公共接口必须是纯C的(例如,你不能通过DLL边界抛出异常)。
  2. 构建一个COM DLL(可能在ATL等工具的帮助下)。
  3. 构建使用COM状技术一个DLL,即仅暴露从DLL抽象接口和工厂的功能(这种技术本文中的段落解释"C++ Mature Approach: Using an Abstract Interface"在CodeProject "HowTo: Export C++ classes from a DLL",尤其是)。

重要的是要指出,the code which allocates memory and the code which frees memory must use the same allocator