【问题标题】:How to check if Windows is 32-bit or 64-bit at runtime [QT/C++] [duplicate]如何在运行时检查 Windows 是 32 位还是 64 位 [QT/C++] [重复]
【发布时间】:2018-08-23 16:47:12
【问题描述】:

如何在运行时检查 Windows 操作系统是 32 位还是 64 位?我想为 32 位编译一次应用程序,但要同时用于两个版本,所以使用宏是不可能的。

据我所知,我应该使用QSysInfo 来确定这一点,但文档中的所有内容看起来都很陌生;我不知道我应该检查什么或应该检查哪个值。

如果有人可以澄清并举例说明如何做到这一点,或者提供更有效的替代方案,将不胜感激!

【问题讨论】:

  • 只是好奇,你为什么要那个?
  • @HolyBlackCat 归根结底,程序运行一个“子程序”,我希望用户能够自定义是使用 32 位还是 64 位版本的子程序.但是,如果用户使用的是 32 位计算机,我希望程序能够检测到这一点并自动使用 32 位子程序而不给他们一个选项。 (正如主帖中提到的,我希望即使使用 32 位主程序的用户也可以在 64 位计算机上选择。)
  • @Griffort 为什么不让用户配置子程序可执行文件的实际路径?这样,他们可以决定是否要使用 32 位或 64 位可执行文件。在 32 位 Windows 上,只有 32 位可执行文件。您的程序在运行时无需检测任何内容,只需运行用户选择的任何可执行文件即可。

标签: c++ windows qt 32bit-64bit


【解决方案1】:

您可以使用IsWow64Process()。它检查应用程序是否在 64 位 Windows 上运行。

For Example:

BOOL Is64BitOS()
{
   BOOL bIs64BitOS = FALSE;

   // We check if the OS is 64 Bit
   typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); 

   LPFN_ISWOW64PROCESS
      fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(
      GetModuleHandle("kernel32"),"IsWow64Process");

   if (NULL != fnIsWow64Process)
   {
      if (!fnIsWow64Process(GetCurrentProcess(),&bIs64BitOS))
      {
         //error
      }
   }
   return bIs64BitOS;
}

【讨论】:

  • 更准确地说,IsWow64Process() 检查应用程序是否是在 64 位 Windows 上运行的 32 位进程。如果在 64 位进程中调用,此代码将返回 FALSE。至少,应该有一个 #ifdef 来为 64 位编译返回 TRUE,并且只为 32 位编译调用 IsWow64Process()
【解决方案2】:

这曾经适用于 C#,您的里程可能会有所不同...

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool IsWow64Process(IntPtr hProcess, out bool wow64Process);

public static bool Is64BitOperatingSystem()
{
    // 64-bit programs run only on Win64
    if (IntPtr.Size == 8)
    {
        return true;
    }
    else
    {
        // 32-bit programs run on both 32-bit and 64-bit Windows
        // Detect whether the current process is a 32-bit process running on a 64-bit system.
        bool flag;
        return ((doesWin32MethodExist("kernel32.dll", "IsWow64Process") &&
                    IsWow64Process(GetCurrentProcess(), out flag)) && flag);
    }
}


 private static bool doesWin32MethodExist(string moduleName, string methodName)
 {
      IntPtr moduleHandle = GetModuleHandle(moduleName);
      if (moduleHandle == IntPtr.Zero)
      {
          return false;
      }
      return (GetProcAddress(moduleHandle, methodName) != IntPtr.Zero);
 }

【讨论】:

  • 注意到 C++ 标签了吗?
  • 是的,我做到了。 C# 代码是 PInvoking Win32 函数,其余的可以很容易地移植到 C/C++。
  • 使用Get(Native)SystemInfo()会比使用IsWow64Process()更好。
猜你喜欢
  • 2012-07-29
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多