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

Posted

技术标签:

【中文标题】我可以使用 VC++ 2008 创建 Dll 并在 VC++ 6 中使用它吗?【英文标题】:can i create Dll with VC++ 2008 and use it in VC++ 6? 【发布时间】:2012-04-02 16:10:56 【问题描述】:

我用 VC++ 2008 制作了一个 DLL,当我在控制台应用程序 VC++ 6.0 中使用它时,出现了一个异常:

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

【问题讨论】:

我从未尝试过,但如果我猜的话,我认为我们不能,因为即使我们在 VS2008 和 VS2006 中编写 c++ 程序的方式也存在很多差异,例如在 2006 年,我们的头文件带有 . h 扩展,但不是在 2008 年。但主要问题是为什么你想从 2008 年到 2006 年? 也许,也许不是。如果您在设计界面时真的非常小心,那当然是可能的。但在一般情况下 - 不,它不会起作用。 你需要从 2008 年的项目中导出一个 C 风格的接口,如果我记得的话,导出 C++ 类只能在一个版本的编译器中工作。 伙计们,我认为这个问题不能称为“不是一个真正的问题”。结束时有点过分热心,是吗? 【参考方案1】:

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

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

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

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

【讨论】:

感谢 Mahmoud,您的笔记对我很有帮助。我正在将文本作为 std::string 发送和接收到 Dll 函数,当我作为 char* 发送和接收它时,问题就解决了。 这几乎总是最大的罪魁祸首。很高兴我能帮上忙。 你好 Mahmoud,对不起,我需要一些帮助。我正在向我的 DLL 发送文本并将其作为 char* 接收,发生了奇怪的事情,如果文本小于 13 个字符或大于 77 个字符,则返回的文本是垃圾!! 不要给我发邮件寻求帮助。【参考方案2】:

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

    构建一个公开纯 C 接口的 DLL。您可以在 DLL 内部使用 C++,但公共接口必须是纯 C 语言(因此,例如,您不能抛出跨 DLL 边界的异常)。 构建 COM DLL(可能借助 ATL 等工具)。 使用 COM-like 技术构建 DLL,即仅公开 DLL 中的 抽象接口 和工厂函数(此技术在 CodeProject "HowTo: Export C++ classes from a DLL" 上的这篇文章中进行了解释,尤其是在"C++ Mature Approach: Using an Abstract Interface"这一段)。

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

【讨论】:

以上是关于我可以使用 VC++ 2008 创建 Dll 并在 VC++ 6 中使用它吗?的主要内容,如果未能解决你的问题,请参考以下文章

VS2008 exe-VC6 dll互操作性

将 VC++ 应用程序移植到 VS2008 的问题

如何使用 ms vc++ 编译器在 netbeans 中构建 dll 文件?

为啥我在visual studio 2008 VC++中运行一个Win32控制台应用程序后,弹出一个“没有找到MSVCP90D.dll”?

使用 VC++ 2008 为 XP 构建屏幕保护程序

VC2008以资源形式实现多语言版本