C++ Qt项目中的TCHAR设置
我正在处理一些使用Qt 4的遗留项目。它是跨平台的,但我对它的窗口部分很感兴趣。我正在尝试将其升级到Qt 5,但我遇到了一个问题。我有很多错误,比如:C++ Qt项目中的TCHAR设置,c++,qt,winapi,qmake,C++,Qt,Winapi,Qmake,我正在处理一些使用Qt 4的遗留项目。它是跨平台的,但我对它的窗口部分很感兴趣。我正在尝试将其升级到Qt 5,但我遇到了一个问题。我有很多错误,比如: error: 'BOOL SomeFunctionW(LPCWSTR)': C2664: cannot convert argument 1 from 'char [123]' to 'LPCWSTR' 我应该使用哪个qmake设置使编译器解释: TCHAR(等等)作为char(等等) SomeFunction作为SomeFunction而不
error: 'BOOL SomeFunctionW(LPCWSTR)': C2664: cannot convert argument 1 from 'char [123]' to 'LPCWSTR'
我应该使用哪个qmake设置使编译器解释:
(等等)作为TCHAR
(等等)李>char
作为SomeFunction
而不是SomeFunction
SomeFunction w
somefunction w
我有:
error: C2664: 'DWORD GetModuleFileNameW(HMODULE,LPWSTR,DWORD)': cannot convert argument 2 from 'char [260]' to 'LPWSTR'
error: C2664: 'DWORD GetEnvironmentVariableW(LPCWSTR,LPWSTR,DWORD)': cannot convert argument 1 from 'const char [14]' to 'LPCWSTR'
error: C2664: 'UINT GetWindowsDirectoryW(LPWSTR,UINT)': cannot convert argument 1 from 'char [260]' to 'LPWSTR'
error: C2664: 'DWORD GetCurrentDirectoryW(DWORD,LPWSTR)': cannot convert argument 2 from 'char [260]' to 'LPWSTR'
error: C2664: 'BOOL SetCurrentDirectoryW(LPCWSTR)': cannot convert argument 1 from 'char [260]' to 'LPCWSTR'```
更新#2:
一些人为的例子
main.cpp
我应该如何更新sample.pro文件来编译示例项目?实际上,我们使用Qt(在Windows上)使代码可移植
SomeFunctionW()
/somefunction()
听起来像win32 API。这些正是我们想要从代码中禁止的函数(因此正在使用Qt…),顺便说一句,恐怕您必须提供更多的上下文才能得到合理的答案。定义\u MBCS
和MBCS
。取消定义\u UNICODE
和UNICODE
。不推荐,但你已经有了。这取决于你如何编译你的项目:unicode或ansi。因此,请确保没有定义\u UNICODE
,这样TCHAR
将被视为char
。啊,好的。我们的做法类似,只是(正如已经推荐的)我更喜欢使用W
后缀显式调用win32 API中的所有内容。我们只在内部使用UTF-8,因为这可以通过标准的字符/字符串函数简单地处理。另外,Qt在内部使用了一些基于Unicode的编码,并且对QString::fromUtf8()
和QString::toUtf8()
有最好的支持。对于win32 API包装器,我们使用UTF-8到UTF-16的转换来为win32函数提供数据(对于检索,使用反向),因为这可以通过简单的位移位来完成。(因此,我非常喜欢的是完全“本地化不可知”。我应该如何更新sample.pro文件来编译样例项目?
简单地定义-=UNICODE
就足够了(除非您实际使用的是\u T()
宏或tchar.h
中的其他“下划线”内容)。
#include <QCoreApplication>
#include <Windows.h>
#include <tchar.h>
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
char buffer[MAX_PATH] = { 0 };
GetCurrentDirectory(sizeof(buffer), buffer);
return a.exec();
}
QT += core
QT -= gui
CONFIG += c++11
TARGET = winapi_sample
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp