C++ Qt项目中的TCHAR设置

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而不

我正在处理一些使用Qt 4的遗留项目。它是跨平台的,但我对它的窗口部分很感兴趣。我正在尝试将其升级到Qt 5,但我遇到了一个问题。我有很多错误,比如:

error: 'BOOL SomeFunctionW(LPCWSTR)': C2664: cannot convert argument 1 from 'char [123]' to 'LPCWSTR'
我应该使用哪个qmake设置使编译器解释:

  • TCHAR
    (等等)作为
    char
    (等等)
  • SomeFunction
    作为
    SomeFunction
    而不是
    SomeFunction w
我使用Visual Studio 2015的编译器

更新:

而不是
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