2012-03-19 131 views
4

IM developin QT应用,并且我需要包括纯的C代码。当我在code :: blocks中编译这段代码时,它是成功的,也许是一个警告,但是当我尝试在QT创建器中编译它时,我得到这4个错误。无法转换的char *到WCHAR * [QT/C++]

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代码而没有任何错误...或如何进行正确的类型转换。

回答

4

您正在编译为Unicode模式。您可以将您的编译设置为多字节字符串。正在发生的问题是那些Windows API函数,是查看是否在建立统一与否,然后调用或者是W或功能的版本(在你的代码中有宏,在GetSystemDirectory实际上是调用GetSystemDirectoryW。所以,你可以要么改变你的编译到多字节的字符串....或者你可以明确地改变你的API调用来调用A版本(即GetSystemDirectoryA

+0

这似乎是一个可行的解决方案,但我仍然有一个错误在这个功能,这里是原型int getKeyboardLayoutFile(字符* layoutFile,DWORD缓冲区大小),并在这里是给出错误的函数调用>> if(RegQueryValueExA(hKey,“Layout File”,NULL,&varType,layoutFile,&bufferSize)!= ERROR_SUCCESS),并且错误是“错误:从'char *'无效转换为'BYTE *'”,“error:初始化参数5'LONG RegQueryValueExA(HKEY __ *,const CHAR *,DWORD *,DWORD *,BYTE *,DWORD *)'“ – 2012-03-19 17:05:48

+0

好吧,它真的很简单(BYTE)* – 2012-03-19 17:57:23

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

相关问题