web-dev-qa-db-ja.com

32ビットまたは64ビットのWindowsを検出

現在のWindows OSが32ビットか64ビットかを検出したい。 C++を使用してそれを達成する方法は? OSのビットタイプが必要なプロセッサタイプは必要ありません。これは、64ビットプロセッサに32ビットOSをインストールできるためです。

45
Rahul

呼び出す関数は IsWow64Process または IsWow64Process2 。 64ビットWindowsで実行されている場合、32ビットアプリケーションに通知します。

プログラムが64ビット用にコンパイルされている場合、既に認識されています。

44
Bo Persson

コードが64ビットで実行されている場合、Windowsは64ビットです。チェックするものはありません。プロセスが32ビットコールの場合 IsWow64Process() -32ビットプロセスは、64ビットWindows上のWOW64で実行され、それ以外の場合はWOW64なしで実行されます。

16
sharptooth
bool getWindowsBit(bool & isWindows64bit)
{
#if _WIN64

    isWindows64bit =  true;
    return true;

#Elif _WIN32

    BOOL isWow64 = FALSE;

    //IsWow64Process is not available on all supported versions of Windows.
    //Use GetModuleHandle to get a handle to the DLL that contains the function
    //and GetProcAddress to get a pointer to the function if available.

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

    if(fnIsWow64Process)
    {
        if (!fnIsWow64Process(GetCurrentProcess(), &isWow64))
            return false;

        if(isWow64)
            isWindows64bit =  true;
        else
            isWindows64bit =  false;

        return true;
    }
    else
        return false;

#else

    assert(0);
    return false;

#endif
}
11
Survarium

IsWow64Process を使用できます。アプリが32ビットアプリの場合、x64 OSで実行している場合は32ビットです

7
Necrolis

GetNativeSystemInfo を使用する必要があります。これが32ビットオペレーティングシステムで動作すると予想される場合、 LoadLibrary + GetProcAddress を使用する必要があります。この機能が利用できないことに対処します。したがって、それが失敗した場合、32ビットオペレーティングシステムであることがわかります。そうでない場合、SYSTEM_INFO.wProcessorArchitectureは、エミュレートされたものではなく、実際のプロセッサタイプを提供します。

5
Hans Passant

GetNativeSystemInfo 関数を使用します。 LPSYSTEM_INFOパラメータを使用して、必要なものを取得します。

SYSTEM_INFO 構造:

wProcessorArchitecture
インストールされているオペレーティングシステムのプロセッサアーキテクチャ。

3

Windowsコマンドsysteminfoをプログラムのプロセスとして実行できます。

#include <stdlib.h>

system("systeminfo");

返されるカテゴリの1つはシステムタイプです。

その出力読み取り:System Type: x86-based PC、またはSystem Type: x64-based PC

これは、他の人が提供するものよりも複雑なソリューションかもしれませんが、可能性として追加したいと思いました。 (たぶん、あなたも追加情報を求めています。)

1
sealz

別の方法を次に示します。 GetSystemWow64Directory -"WOW64が使用するシステムディレクトリのパスを取得します。このディレクトリは32ビットWindowsには存在しません。" 「32ビットWindowsでは、関数は常に失敗し、拡張エラーは_ERROR_CALL_NOT_IMPLEMENTED_に設定されます。」

私は個人的に_IsWow64Process_の使用法について確信がありません。なぜなら、MSDNで_IsWow64Process_の説明に「この技術はオペレーティングシステムが64 32ビットWindowsの現在のバージョンのKernel32.dllにもこの関数が含まれているため、Windowsのビットバージョン。」

1
user3759036