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

时间:2016-04-15 14:06:19

标签: c++ qt system-information

我有一个32位和64位版本的应用程序,需要做一些特殊的事情,因为它是在64位Windows上运行的32位版本。我想避免使用特定于平台的呼叫,而是使用Qt或boost。对于Qt,除了Q_PROCESSOR_X86_32之外,我发现了Q_OS_WIN64,这似乎正是我所需要的。但它不起作用:

#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

在我的64位Windows 7上运行32位应用程序时,这没有任何结果。我是否误解了这些全局声明的文档?

由于存在一些混淆:这不是关于检测应用当前正在运行的操作系统,而是关于检测&#34; bitness&#34;应用程序本身。

5 个答案:

答案 0 :(得分:4)

查看QSysInfo::currentCpuArchitecture():当在64位主机上运行时,它将返回包含"64"的字符串。类似地,QSysInfo::buildCpuArchitecture()将在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位代码的所有体系结构。

答案 1 :(得分:1)

正确的名称是Q_PROCESSOR_X86_32Q_PROCESSOR_X86_64

但是,如果您的应用程序在将来运行在ARM上,则无法运行。相反,请考虑检查sizeof(void *)QT_POINTER_SIZE

另外请注意,在Windows上,GUI应用程序通常无法输出到stdout,因此它可能有效但不显示任何内容。使用eithrr调试器或消息框或输出到某个虚拟文件。

答案 2 :(得分:1)

预处理程序指令在编译时进行评估。你想要做的是编译32位并在运行时检查你是否在64位系统上运行(注意你的进程将是32位):

#ifdef Q_PROCESSOR_X86_32
  std::cout << "32 Bit App" << std::endl;

  BOOL bIsWow64 = FALSE;
  if (IsWow64Process(GetCurrentProcess(), &bIsWow64) && bIsWow64)
      std::cout << "Running on 64 Bit OS" << std::endl;
#endif

该示例为Windows specific。没有一种可移植的方式,Linux您可以 使用运行system("getconf LONG_BIT")system("uname -m")并检查其输出。

答案 3 :(得分:1)

您可以使用GetNativeSystemInfo(见下文)来确定操作系统的版本。正如其他已经提到的,App的版本是在编译时确定的。

_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
}

答案 4 :(得分:0)

您可以使用Q_PROCESSOR_WORDSIZE(或here)。我很惊讶它没有记录,因为它不在私有标头(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() {
    qDebug() << QStringLiteral("%1-bit executable").arg(Q_PROCESSOR_WORDSIZE * 8);
}