在 VS2013 中创建与 VC++ 6.0 向后兼容的 Dll

Posted

技术标签:

【中文标题】在 VS2013 中创建与 VC++ 6.0 向后兼容的 Dll【英文标题】:Create Dll in VS2013 that'll be backwards compatible with VC++ 6.0 【发布时间】:2016-05-05 15:04:21 【问题描述】:

我必须为我正在处理的遗留项目开发新功能,我更愿意在现代 IDE 中这样做。遗留代码是在 VC++6 中开发的,我想在 VS2013 中开发这个附加库。仅在某些情况下,这将用于 RFID 身份验证系统。

这会是个问题吗?从概念上讲,该库将只有 4 个导出函数:OpenReaders()CloseReaders()ValidateTag(int reader)。它可能有更多的导出功能,但这些只会用于我将开发的另一个外部程序。该程序将用于配置数据库,然后库本身将使用该数据库。其他所有内容都将独立包含在 DLL 中。

现在,我知道在将项目从 VC++ 6.0 迁移到新版本的 Studio 时,Unicode 字符存在一些问题。当我尝试将当前项目升级到 Studio 2013 时,我遇到了这些问题,并且在很大程度上取得了成功。但是在被一个控制欲很强的同事大吼大叫之后(顺便说一句,他不是我的老板,但对我有意见,当他向我的老板报告我时,往往会按他的方式行事;通常每当我们在某件事上意见不一时就会发生这种情况解决方案)我恢复到 VC++ 6.0。但是,在尝试让更新的 DLL 与旧的代码库通信时,肯定还有其他一些我不知道的复杂情况。

【问题讨论】:

您唯一需要考虑的是您发送到 DLL 的参数类型以及这些 DLL 函数的返回类型。如果类型是 Windows 类型,即LONG, BOOL, LPCTSTR, 等......那么应该没有任何问题。另一方面,如果您要发送诸如std::vectorstd::string 之类的类型,那么这将不会很好地工作。 bleh... 让微软不要遵循标准。我更喜欢 POSIX 编程是有原因的。那么如果我使用来自std 的类型会出现什么问题呢?我本来希望它是相反的方式。其次,重申一下,这对于 DLL 中包含的类型无关紧要,对吗?只有我传递的东西,因为它只会是int,我希望不会有任何问题。 不能跨编译器传递std::string和其他STL类型的原因是编译器之间的内部实现不同。 FILE 类型也是如此,这甚至不是 C++——不同的内部实现。此外,您应该使用LONG,因为LONG 是在整个Windows API 中使用的已知Windows 类型。 int 是 C++ 类型,理论上可能与 LONG 大小不同。 @PaulMcKenzie 这是有道理的。现在到我的第二点,我可以在 DLL 本身中(在合理范围内)使用我想要的任何东西,对吧? 是的,在 DLL 中,您可以使用任何可行的方法。我已经构建了内部使用 C++ 11 功能的 DLL,并且当使用旧编译器构建的应用程序使用该 DLL 时,该 DLL 可以工作。 【参考方案1】:

您需要考虑的主要事项是您发送到 DLL 导出函数的参数类型以及这些导出函数的返回类型。如果类型是 Windows 类型,即

LONG, BOOL, LPCTSTR,

等等……

那么应该没有问题,或者如果有任何问题,很容易解决。

然而,一个问题可能是 DLL 是 Unicode,而您的应用程序是 MBCS,而字符串类型会妨碍您。但是,即使在 Visual C++ 6.0 的旧时代,也有一些方法可以提供 Unicode 字符串或接收此类字符串(使用MultiByteToWideCharWideCharToMultiByte,至少回到 Windows 2000)。

另一方面,如果您要发送 std::vectorstd::string 等类型,那么这将不会很好地工作。原因是这些类型在编译器之间具有不同的内部实现,因此从 Visual Studio 6.0 传递给 DLL 的 std::string 与 Visual Studio 2013 使用的 std::string 不同。

因此,纠正最后一种情况变得很困难,并且需要对 VS 6.0 代码和 DLL 代码进行重大更改(例如发送 char 缓冲区而不是字符串类型,发送 T* 和大小而不是 std::vector<T>等)

【讨论】:

以上是关于在 VS2013 中创建与 VC++ 6.0 向后兼容的 Dll的主要内容,如果未能解决你的问题,请参考以下文章

C++ MFC VC 6.0 到 VS2013 lStreamReturn = GetRichEditCtrl().StreamIn(SF_RTF, es);

如何在pycharm中使用vc 6.0

在 MFC VS2010 和 VC++6.0 中画线没有得到相同的结果

如何将 VC++6.0 项目升级到 VS2010?

vc++6.0和VC2017区别

关于VS2013+WDK8.1写驱动文件配置问题