在VS2013中创建Dll,它将向后兼容VC ++ 6.0

时间:2016-05-05 15:04:22

标签: c++ visual-studio visual-c++ dll vc6

我必须为我正在开发的遗留项目开发新功能,而我更喜欢在现代IDE中这样做。遗留代码是在VC ++ 6中开发的,我想在VS2013中开发这个额外的库。仅就某些情况而言,这将用于RFID认证系统。

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

现在,我知道在将项目从VC ++ 6.0迁移到较新版本的Studio时,Unicode字符存在一些问题。当我尝试将当前项目升级到Studio 2013并且在很大程度上成功时,我遇到了这些问题。但是在被一个相当控制的同事大吼大叫之后(顺便说一下,他不是我的老板,但是当我向我的老板报告时,他对我很有吸引力并倾向于采取行动;通常这种情况发生在我们不同意的情况下解决方案)我又回到了VC ++ 6.0。但是,在尝试使用较新的DLL与较旧的代码库进行通信时,我必须注意到其他一些并发症。

1 个答案:

答案 0 :(得分:2)

您需要考虑的主要事项是您要发送到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*和大小而不是{ {1}}等。)