在MBCS项目中使用unicode dll,反之亦然

时间:2015-05-16 15:48:04

标签: c++ c visual-c++ dll unicode

我有一个vc ++ dll,使用设置为“使用Unicode字符集”的字符集进行编译。 现在我想在我的vc ++ exe中使用这个dll,其字符集是“Use Multi-Byte Character Set”。我知道理论上没有什么能阻止我这样做,因为在编译vc ++ dll后,所有函数签名都是wchar_t或LPCWSTRs。在我的vc ++ exe中,我只需创建该格式的字符串并调用导出的函数。但是,我面临的问题是,unicode dll中的标题需要TCHAR参数,例如ex:

class MYLIBRARY_EXPORT PrintableInt
{
public:
    PrintableInt(int value);
    ...
    void PrintString(TCHAR* somestr);

private:
   int m_val;
};

现在我想在我的exe中使用这个PrintString()。所以,我包括标题并使用它如下:

#include "unicodeDllHeaders.h"
PrintableInt p(2);
wchar_t* someStr = L"Some str";
p.PrintString(someStr);

这符合预期会给我一个编译错误:

error C2664: 'PrintableInt::PrintString' : cannot convert parameter 1 from 'wchar_t *' to 'TCHAR *'

由于exe是使用MBCS构建的,因此将TCHAR定义为char。所以,我认为可以解决这个问题的是:

#define _UNICODE
#include "unicodeDllHeaders.h"
#undef _UNICODE

但是在定义_UNICODE之后我还是得到了编译错误。所以,我的下一个猜测是,可能TCHAR.h已经包含在#include“unicodeDllHeaders.h”之前,当我搜索包含TCHAR.h时,它还有其他地方在项目中。因此,我将包含移到了_UNICODE的定义之后,这解决了这里的编译错误,但是在其他需要使用TCHAR的地方失败了。所以,我的问题是:

我可以以某种方式使TCHAR解析为同一项目中的char和wchar_t吗?我尝试了#define TCHAR char,#undef TCHAR,#define TCHAR wchar_t,但它在c头文件中失败,如xutils

1 个答案:

答案 0 :(得分:0)

无论使用宏如何处理头文件,都无法追溯更改DLL的二进制接口。典型的解决方案是首先转储整个遗留MBCS的东西。这在10年前就已经不再有意思了,现在支持win32 API的所有目标都支持具有完全Unicode支持的宽字符界面。

如果你想要九十年代的复古感觉,你也可以编译你的DLL两次,一次使用CHAR,一次使用WCHAR。后者通常会得到一个" u"后缀(用于Unicode)。在标题中,然后检查charset并使用#pragma comment lib..委托相应的DLL。