无法将 char* 转换为 WCHAR* [qt/c++]

Posted

技术标签:

【中文标题】无法将 char* 转换为 WCHAR* [qt/c++]【英文标题】:Cannot convert char* to WCHAR* [qt/c++] 【发布时间】:2012-04-03 23:10:51 【问题描述】:

我正在开发 QT 应用程序,我需要包含纯 C 代码。当我在 code::blocks 中编译这段代码时它是成功的,可能是一个警告,但是当我尝试在 QT creator 中编译它时,我得到了这 4 个错误。

cannot convert 'char*' to 'WCHAR*' for argument '1' to 'UINT GetSystemDirectoryW(WCHAR*, UINT)'
cannot convert 'char*' to 'const WCHAR*' for argument '1' to 'HINSTANCE__* LoadLibraryW(const WCHAR*)'
 cannot convert 'char*' to 'WCHAR*' for argument '1' to 'BOOL 
 cannot convert 'const char*' to 'const WCHAR*' for argument '2' to 'LONG RegQueryValueExW(HKEY__*, const WCHAR*, DWORD*, DWORD*, BYTE*, DWORD*)'

代码在这里>

char systemDirectory[MAX_PATH]; 
GetSystemDirectory(systemDirectory, MAX_PATH); //first error
char kbdLayoutFilePath[MAX_PATH];
kbdLibrary = LoadLibrary(kbdLayoutFilePath); //second error
char kbdName[KL_NAMELENGTH];
GetKeyboardLayoutName(kbdName); //third error
if(RegQueryValueEx(hKey, "Layout File", NULL, &varType, layoutFile, &bufferSize) != ERROR_SUCCESS) //fourth error

我也使用了 snprintf 函数,所以我不能只将类型从 char 更改为 WCHAR,因为那样它不会编译 snprintf

snprintf(kbdKeyPath, 51 + KL_NAMELENGTH,
"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s", kbdName);

那么您有任何解决方法的想法吗?首先我尝试将类型从 char 更改为 WCHAR,但随后 snprintf 不起作用,所以我尝试使用 swprinf,但没有成功,因为奇怪的是它没有找到这个函数

int swprintf(wchar_t *wcs, size_t maxlen,
             const wchar_t *format, ...);

只是这个

int swprintf(wchar_t *wcs,
                 const wchar_t *format, ...);

那么我的选择是什么?如何在 c++ 环境中编译纯 C 代码而不会出现任何错误……或者如何进行正确的类型转换。

【问题讨论】:

【参考方案1】:

您正在以 Unicode 模式编译。您可以将编译设置为多字节字符串。正在发生的问题是那些 Windows API 函数是检查您是否正在构建 Unicode 的宏,然后调用该函数的 W 或 A 版本(在您的代码中,GetSystemDirectory 实际上是调用GetSystemDirectoryW。因此,您可以将编译更改为多字节字符串......或者您可以显式更改您的 api 调用以调用A 版本(即GetSystemDirectoryA

【讨论】:

这似乎是一个可行的解决方案,但我在这个函数中仍然有一个错误,这是原型 int getKeyboardLayoutFile(char* layoutFile, DWORD bufferSize) ,这是给出错误的函数调用>> if(RegQueryValueExA(hKey, "Layout File", NULL, &varType, layoutFile, &bufferSize) != ERROR_SUCCESS),错误是“error: invalid conversion from 'char*' to 'BYTE*'”, “error: initializing argument 5 of 'LONG RegQueryValueExA(HKEY__, const CHAR, DWORD*, DWORD*, BYTE*, DWORD*)'"【参考方案2】:

您正在使用 UNICODE 或 _UNICODE 定义编译您的项目。检查您的项目设置并在必要时删除定义。要删除定义,您可能需要禁用整个项目的 unicode 支持。

【讨论】:

【参考方案3】:

char 切换到WCHAR,然后解决您的swprintf 问题,只需这样做

#define   swprintf   _snwprintf

在Windows上,swprintf的原型是

int swprintf( wchar_t *buffer,const wchar_t *format [,argument] ... );

但 ISO C 标准要求 swprintf 的以下原型

int swprintf (wchar_t *, size_t, const wchar_t *, ...);

正因如此,在 Windows 上,提供了_snwprintf

阅读本文了解更多详情

http://msdn.microsoft.com/en-us/library/ybk95axf(v=vs.71).aspx

【讨论】:

以上是关于无法将 char* 转换为 WCHAR* [qt/c++]的主要内容,如果未能解决你的问题,请参考以下文章

如何将 char 数组转换为 wchar_t 数组?

wchar_t到QString的转换方法?

char* 和 wchar_t* 如何互相转换

QT 下把编辑框内的中文字符转换为 char*

如何定义宏以将连接的char字符串转换为C中的wchar_t字符串

c++中wchar转char