C++ Qt检查当前进程是32位还是64位

C++ Qt检查当前进程是32位还是64位,c++,qt,system-information,C++,Qt,System Information,我有32位和64位版本的应用程序,需要做一些特殊的事情,以防32位版本在64位Windows上运行。我希望避免平台特定的调用,而是使用Qt或boost。对于Qt,我发现除此之外,这似乎正是我所需要的。但它不起作用: #include <QtGlobal> #ifdef Q_PROCESSOR_X86_64 std::cout << "64 Bit App" << std::endl; #endif #ifdef Q_PROCESSOR_X86_32

我有32位和64位版本的应用程序,需要做一些特殊的事情,以防32位版本在64位Windows上运行。我希望避免平台特定的调用,而是使用Qt或boost。对于Qt,我发现除此之外,这似乎正是我所需要的。但它不起作用:

#include <QtGlobal>

#ifdef Q_PROCESSOR_X86_64
  std::cout << "64 Bit App" << std::endl;
#endif

#ifdef Q_PROCESSOR_X86_32
  std::cout << "32 Bit App" << std::endl;
#endif
#包括
#ifdef Q_处理器_X86_64
std::cout正确的名称是或
Q\u处理器\u X86\u 64

但是,如果您的应用程序将来在ARM上运行,这将不起作用。而是考虑检查<代码> SIZEOF(空洞*)< /代码>,例如,


另外请注意,在Windows上,GUI应用程序通常无法输出到标准输出,因此它可以工作,但不会显示任何内容。使用eithrr调试器或消息框,或者输出到某个伪文件。

预处理器指令在编译时计算。您要做的是编译32位,并在运行时检查您是否在64位系统上运行(请注意,您的进程将是32位的):

#ifdef Q_处理器_X86_32
std::cout看一看:在64位主机上运行时,它将返回一个包含
“64”
的字符串。类似地,在64位主机上编译时将返回此类字符串:

bool isHost64Bit() {
  static bool h = QSysInfo::currentCpuArchitecture().contains(QLatin1String("64"));
  return h;
}
bool isBuild64Bit() {
  static bool b = QSysInfo::buildCpuArchitecture().contains(QLatin1String("64"));
  return b;
}
然后,要检测的条件是:

bool is32BuildOn64Host() { return !isBuild64Bit() && isHost64Bit(); }

这应该可以移植到所有支持在64位主机上运行32位代码的体系结构。

您可以使用GetNativeSystemInfo(见下文)来确定操作系统的版本。正如前面提到的,应用程序的版本是在编译时确定的

_SYSTEM_INFO sysinfo;
GetNativeSystemInfo(&sysinfo);
if (sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
{
     //this is a 32-bit OS
}
if (sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
{
     //this is a 64-bit OS
}
您可以使用(或)。我很惊讶它没有文档化,因为它不在私有头(QtGlobal)中,而且非常方便

对于某些用例,它可能更可取,因为它不依赖于处理器体系结构。(例如,对于x86_64以及arm64和许多其他产品,它的定义是相同的)

例如:

#include <QtGlobal>
#include <QDebug>

int main() {
#if Q_PROCESSOR_WORDSIZE == 4
    qDebug() << "32-bit executable";
#elif Q_PROCESSOR_WORDSIZE == 8
    qDebug() << "64-bit executable";
#else
    qDebug() << "Processor with unexpected word size";
#endif
}
#包括
#包括
int main(){
#如果Q_处理器_字号==4

qDebug()会
\u WIN64
做什么?我需要一个组合。Q_OS_WIN/64和Q_处理器_X86_32/64。比如:if(WIN64&&AppIs32)做a;if(WIN64&&AppIs64)做B;if(Win32&&AppIs32)做C;if(Win32&&AppIs64)do D;Q_OS_WIN64按照文档中的预期工作,顺便说一句。你不能在编译时做出决定。对于你的32位构建,你必须在运行时使用@IInspectable:Not duplicate,Windows API vs Qt来查询操作系统。这个问题没有任何意义。首先,你说,如果32位的构建是y,你需要做一些特殊的事情我们的应用程序运行在64位操作系统上。在你试图澄清困惑时,你自相矛盾地说,你不需要检测操作系统的位。是时候下定决心了。嗯……不。可移植代码可能是可移植的。但它是错的。它永远不会输出“在64位操作系统上运行”,即使是这样。像预处理器宏一样,sizeof运算符在编译时进行计算。我想我明白你们的意思了。谢谢you@DenverCoder21-也被编辑了,GUI通常无法打印到标准输出。函数中的所有其他std::Cout也可以工作,所以实际上这不应该是问题所在。这就解决了问题。谢谢!@AdrianoReptti:我不是正在尝试检测操作系统版本,但检测应用程序本身的版本。@DenverCoder21:您已经知道应用程序的位:您在生成环境中设置了它。然后,请显示一些代码,如果应用程序是32位且在Win64上运行,则调用函数A;如果应用程序是32位且在Win32上运行,则调用函数B;如果是64位且在Win64上运行,则调用函数C@DenverCoder21那么你是在试图检测操作系统版本。你自相矛盾!你有没有在64位操作系统上用32位构建测试过这个解决方案?正如我所说,我需要两者的结合。当然,我还需要知道操作系统版本,但我还需要区分应用程序版本以实现不同的行为。
#include <QtGlobal>
#include <QDebug>

int main() {
#if Q_PROCESSOR_WORDSIZE == 4
    qDebug() << "32-bit executable";
#elif Q_PROCESSOR_WORDSIZE == 8
    qDebug() << "64-bit executable";
#else
    qDebug() << "Processor with unexpected word size";
#endif
}
int main() {
    qDebug() << QStringLiteral("%1-bit executable").arg(Q_PROCESSOR_WORDSIZE * 8);
}