ユーザーが使用している可能性のあるWindowsのバージョンを検出するのを手伝ってもらえますか?
これを行うためのいくつかの例を見てきましたが、Vista/7オペレーティングシステム用に更新されていません。
さらに、OSがx32またはx64アーキテクチャで実行されているかどうかを検出すると便利です。
前もって感謝します。
XE2では、これに対処するために新しいクラスが導入されました: TOSVersion
。
TOSVersion.Architecture
を読んで、32ビットまたは64ビットのOSを確認します。TOSVersion.Platform
を読んで、WindowsまたはMacを確認してください。TOSVersion.Major
およびTOSVersion.Minor
をお読みください。TOSVersion.Name
を読んで、基本的な製品名を取得します。例: Windows7。TOSVersion.ToString
を読んで、バージョンを含む完全な製品名を取得します。例: Windows 7 Service Pack 1(バージョン6.1、ビルド7601、64ビット版)。古いバージョンのDelphiの場合、次のことをお勧めします。
2000、XP、Vista、7を確認するには、 Win32MajorVersion
および Win32MinorVersion
を読むことをお勧めします。
同じ情報が [〜#〜] msdn [〜#〜] で利用可能ですが、上記は私の頭から来ました!
非常に詳細な製品情報が必要な場合は、もう少し作業が必要です。ウォーレンの答えは、その情報を取得するための1つの良いルートを示しています。機能をテストしたい場合は、バージョン番号で問題ありません。
CheckWin32Version
を使用して、一般的なOSが特定のバージョンレベルを超えているかどうかを確認します。ただし、Delphi 6以前での関数の実装が正しくなかったため、Delphiで関数が正しく機能することを確認する必要があります。
ネイティブOSアーキテクチャ(32ビットまたは64ビット)を確認するには、 GetNativeSystemInfo
関数を使用します。この関数は古いオペレーティングシステムでは使用できないため、GetProcAddress
を使用して明示的にロードする必要があります。 wProcessorArchitecture=PROCESSOR_ARCHITECTURE_AMD64
をテストして、64ビットOSを確認します。
JEDI JCLは、XE2より古いバージョンでも、すでにこれを実行しています。 XE2以降の組み込みソリューションについては、Davidの回答を参照してください。
Jedi JCLを使用して、ユニットJclSysInfoを追加し、関数GetWindowsVersion
を呼び出すことができます。列挙型TWindowsVersionを返します。
現在、JCLには出荷されたすべてのWindowsバージョンが含まれており、Microsoftが新しいバージョンのWindowsをボックスで出荷するたびに変更されます。
TWindowsVersion =
(wvUnknown, wvWin95, wvWin95OSR2, wvWin98, wvWin98SE, wvWinME,
wvWinNT31, wvWinNT35, wvWinNT351, wvWinNT4, wvWin2000, wvWinXP,
wvWin2003, wvWinXP64, wvWin2003R2, wvWinVista, wvWinServer2008,
wvWin7, wvWinServer2008R2);
32ビットではなく64ビットのWindows7を実行しているかどうかを知りたい場合は、JclSysInfo.IsWindows64
を呼び出します。
JCLは、Pro、Ultimateなどのエディションもすべて処理することに注意してください。そのためにGetWindowsEditionを呼び出すと、次のいずれかが返されます。
TWindowsEdition =
(weUnknown, weWinXPHome, weWinXPPro, weWinXPHomeN, weWinXPProN, weWinXPHomeK,
weWinXPProK, weWinXPHomeKN, weWinXPProKN, weWinXPStarter, weWinXPMediaCenter,
weWinXPTablet, weWinVistaStarter, weWinVistaHomeBasic, weWinVistaHomeBasicN,
weWinVistaHomePremium, weWinVistaBusiness, weWinVistaBusinessN,
weWinVistaEnterprise, weWinVistaUltimate, weWin7Starter, weWin7HomeBasic,
weWin7HomePremium, weWin7Professional, weWin7Enterprise, weWin7Ultimate);
歴史的な興味のために、NtProductType関数を使用してNTレベルのエディションを確認することもできます。
TNtProductType = (ptUnknown, ptWorkStation, ptServer, ptAdvancedServer,
ptPersonal, ptProfessional, ptDatacenterServer,
ptEnterprise, ptWebEdition);
上記で「Nエディション」が検出されていることに注意してください。これは、EUの独占禁止法に基づいて作成されたWindowsのEU(ヨーロッパ)バージョンです。これは、JCL内の検出のかなり細かいグラデーションです。
これは、Vistaを検出し、Vistaで何か特別なことをするのに役立つサンプル関数です。
function IsSupported:Boolean;
begin
case GetWindowsVersion of
wvVista: result := false;
else
result := true;
end;
end;
「より大きい」チェックを実行する場合は、他の手法を使用する必要があることに注意してください。また、バージョンチェックは将来の破損の原因となることが多いことにも注意してください。私は通常、ユーザーに警告して続行することを選択しました。これにより、バイナリコードが将来の実際の破損の原因にならないようにしています。
最近、アプリをインストールしようとしましたが、2ギガバイトを超える空き容量があるため、インストーラーがドライブの空き容量を確認しましたが、インストールされませんでした。インストーラーの32ビット整数符号付き値が負になり、インストーラーが破損しました。動作させるには、VM)にインストールする必要がありました。「スマートコード」を追加すると、アプリが「ばかげた」ものになることがよくあります。注意してください。
ちなみに、コマンドラインからWMIC.exeを実行して、path Win32_OperatingSystem
と入力できることがわかりました(「Select * fromWin32_OperatingSystem」は機能しませんでした)。将来的には、JCLを拡張してWMI情報を使用する可能性があります。
示されているユニット(GetWinVersionInfo) ここ はVistaまでを検出します。 Windows7用に更新するのがそれほど難しいとは想像できません。ただし、x86.x64を示しているとは思いません。
Delphidabbler.comには、64ビットバージョンを含むオペレーティングシステムバージョンの取得に関する 完全な記事 があります。ただし、この記事はVista/7を含むように更新されていません。ただし、同じ機能が引き続き機能する可能性があります。