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

6

我正在开发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代码而不出现任何错误...或者如何进行正确的类型转换。

3个回答

4
您正在使用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*)'”。 - Anton Giertli

2

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


0

将代码中的 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接