如何在运行时检查Windows是32位还是64位[QT / C ++]

时间:2018-03-15 00:49:12

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

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

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

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:-1)

这曾经用于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);
 }