在MBCS项目中使用unicode dll,反之亦然
using unicode dlls in MBCS projects or vice versa
我有一个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。
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- C++ - Unicode Newline
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何将unicode字符串从C++传递到delphi
- C++:将外部库链接到dll库
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 不同的Visual Studio版本中缺少.dll
- 从DLL中删除类的实例
- 如何包装第三方DLL在R中使用
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- c# EXE /非托管c++ Unicode DLL链接到非托管c++ ANSI DLL崩溃
- 如何将C++dll中的unicode字符串/wstring/CStringW返回到InstallScript
- 在MBCS项目中使用unicode dll,反之亦然