无法将char*转换为WCHAR*[qt/c++]
Cannot convert char* to WCHAR* [qt/c++]
im开发QT应用程序,并且我需要包含纯C代码。当我在code::blocks中编译这段代码时,它是成功的,也许有一个警告,但当我试图在qtcreator中编译它时,我得到了这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不起作用,所以我尝试使用swpriff,但没有成功,因为奇怪的是,它没有找到这个函数
int swprintf(wchar_t *wcs, size_t maxlen,
const wchar_t *format, ...);
但是只有这个
int swprintf(wchar_t *wcs,
const wchar_t *format, ...);
那么我的选择是什么呢?如何在C++环境中编译纯C代码而不会出现任何错误。。。或者如何进行正确的类型转换。
您正在以Unicode模式进行编译。您可以将编译设置为多字节字符串。出现的问题是,那些windows API函数是宏,它们检查您是否正在构建Unicode,然后调用函数的W或A版本(在那里的代码中,GetSystemDirectory
实际上是在调用GetSystemDirectoryW
。因此,您可以将编译更改为多字节字符串……也可以显式更改API调用以调用A
版本(即GetSystemDirectoryA
)
您正在使用UNICODE或_UNICODE定义编译项目。检查您的项目设置,并在必要时删除定义。若要删除定义,您可能需要禁用对整个项目的unicode支持。
从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
- Qt VTK交互风格的信号到小部件
- QT在错误的班级中寻找空位
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 如何在Qt C++中更改光标
- 如何在MS Visual Studio 2019中运行QT UI
- QT通过C++添加映射QML项目
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用Qt C++计算类似Git的SHA1哈希
- Qt focusObjectChanged example?
- 如何在cpp文件之间切换窗口?在Qt中
- Qt和C++:将QLineEdit添加到QTabWidget中
- 从数据库实时显示QT c++中的数据
- Qt Quick-如何仅从c++代码与qml属性交互
- 无法使用Qt Creator在Windows中构建yaml-cpp
- 如何在Qt中取消捕获字符串
- Qt SQLite没有查询或参数计数不匹配
- Qt SQlite无法创建表