2016-04-15 17 views
1

私のアプリケーションは32ビット版と64ビット版があり、64ビット版Windowsで動作する32ビット版の場合は特別な処理が必要です。私はプラットフォーム固有の呼び出しを避け、代わりにQtまたはブーストを使用したいと思います。 QtのためにQ_PROCESSOR_X86_32のほかにQ_OS_WIN64が見つかりました。これは私が必要とするものです。しかし、それは動作しません:現在のプロセスが32または64ビットであるかどうかを確認する

#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ビットアプリケーションを実行するときにこれが何を出していない私は、これらのグローバル宣言のドキュメントを誤解していますか?

いくつかの混乱があります。これは、アプリケーションが現在実行しているOSを検出することではなく、アプリケーション自体のビット数を検出することです。

+0

'_WIN64'は行いますか? – Biffen

+0

私は組み合わせが必要です。 Q_OS_WIN/64およびQ_PROCESSOR_X86_32/64のうちの1つ。次のようになります。 if(Win64 && AppIs32)if A; if(Win64 && AppIs64)がBを実行する。 if(Win32 && AppIs32)がCを実行する。 if(Win32 && AppIs64)がDを実行する。 Q_OS_WIN64は、docs btwから期待どおりに動作します。 – DenverCoder21

+0

私は本当に問題を理解していません。ごめんなさい。 – Biffen

答えて

1

正しい名前はQ_PROCESSOR_X86_32またはQ_PROCESSOR_X86_64です。

あなたのアプリケーションは将来ARMで動作しますが、これは動作しません。むしろ、たとえばsizeof(void *)またはQT_POINTER_SIZEをチェックすることを検討してください。

また、Windowsでは、GUIアプリケーションは通常、stdoutに出力できないため、動作しても何も表示されません。 eithrrデバッガまたはメッセージボックスを使用するか、ダミーファイルに出力してください。

+0

既に編集済みです。 – DenverCoder21

+0

@ DenverCoder21 - 編集しても、GUIは標準出力には通常印刷できません。 –

+0

他のすべてのstd :: coutsも機能しているので、実際には問題ではありません。 – DenverCoder21

1

プリプロセッサディレクティブは、コンパイル時にと評価されます。例はWindows specificされていることを

#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 

:何がやりたいことは、あなたが64ビットシステム(あなたのプロセスが32ビットになることに注意してください)上で実行している場合は32ビットのため、実行時のチェックイン時にコンパイルすることです。それを行うための移植可能な方法はありません。Linuxsystem("getconf LONG_BIT")またはsystem("uname -m")を実行して出力を確認してください。

+0

Uhm ...いいえ。そのポータブルコードはポータブルである可能性があります。しかしそれは間違っている。 ** 64ビットOS上で実行することはできません。プリプロセッサマクロと同様に、sizeof演算子はコンパイル時に評価されます。 – IInspectable

+0

@IInspectableあなたは_d **** _右です、私には恥があります。 –

+0

私はあなたの人が何を意味していると思います。 – DenverCoder21

2

代わりにQSysInfo::buildCpuArchitecture()またはQSysInfo::currentCpuArchitecture()を使用してみてください。

+0

**いいえ**、buildCpuArchitecture()は、Qtが**のために**コンパイルされたCPUの_アーキテクチャですが、currentCpuArchitecture()はOSではなく** CPUです。あなたが32ビットOSを実行している64ビットCPUを持っているなら、これは間違っているでしょう(そして、モバイルデバイスがない限り、10年以上経過していないシステムでは最も一般的なシナリオです) –

+0

これはトリックです。ありがとうございました! @AdrianoReptti:私はOSのバージョンではなく、アプリケーション自体のバージョンを検出しようとしていません。 – DenverCoder21

+1

@ DenverCoder21:あなたはすでにアプリケーションのビット数を知っています**:ビルド環境でそれを設定します。 – IInspectable

1

GetNativeSystemInfo(下記参照)を使用して、OSのバージョンを調べることができます。すでに述べたように、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 
} 
関連する問題