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

using unicode dlls in MBCS projects or vice versa

本文关键字:unicode dll 反之亦然 MBCS 项目      更新时间:2023-10-16

我有一个vc++ dll,它是用字符集设置为'使用Unicode字符集'编译的。现在我想在我的vc++ exe中使用这个dll,其字符集是"使用多字节字符集"。我知道,理论上没有什么能阻止我这样做,因为在编译vc++ dll之后,所有的函数签名都是wchar_t或LPCWSTRs ..在我的vc++ exe中,我只是创建那种格式的字符串并调用导出的函数。但是,我面临的问题是,unicode dll中的标头采用TCHAR参数,例如:

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"unicodellheaders .h"之前,当我搜索TCHAR.h的包含时,它在项目的其他地方。因此,我将包含移动到_UNICODE定义之后,这解决了这里的编译错误,但它在其他地方失败,其中TCHAR被期望为char。所以,我的问题是:

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

无论使用宏对头文件做了什么,都不能追溯地更改DLL的二进制接口。典型的解决方案是首先抛弃所有遗留的MBCS内容。这在10年前就不再有趣了,现在所有支持win32 API的目标都支持具有完整Unicode支持的宽字符接口。

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