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

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

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

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

private:
   int m_val;
};

现在我想在我的exe中使用这个PrintString()。因此,我包含了 header 并按如下方式使用它:

#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 预期为 char 的其他地方失败了。所以,我的问题是:

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

最佳答案

无论使用宏对头文件做什么,您都无法追溯更改 DLL 的二进制接口(interface)。典型的解决方案是首先转储整个遗留的 MBCS 内容。这在 10 年前就不再有趣了,现在所有支持 win32 API 的目标都支持宽字符界面,并完全支持 Unicode。

如果您想要九十年代的复古感觉,您还可以编译您的 DLL 两次,一次使用 CHAR,一次使用 WCHAR。后者通常会带有“u”后缀(对于 Unicode)。然后,在 header 中检查字符集并使用 #pragma comment lib.. 委托(delegate)给相应的 DLL。

关于c++ - 在 MBCS 项目中使用 unicode dll,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30277673/

相关文章:

c++ - Windows-7/64 位上的免注册 COM 对象

c++ - 静态函数作用域对象的构造是线程安全的吗?

c++ - Eclipse CDT : nothing could be resolved?

c - VMWare-Mount 无法识别虚拟磁盘

c++ - 为什么插入运算符打印地址而不是字符串?

c++ - 删除运算符和数组?

c - Notepad++ 和 stdint.h 类型

Windows 中区分大小写的目录路径

c++ - 是否可以在不使用汇编的情况下告诉 clang 哪些寄存器用于代码的某些部分

visual-c++ - 如何在WTL中模拟模式对话框?