及川です。
Windows 上にアプリケーションをインストール際に必要な確認事項とその方法はアプリケーションによってまちまちだと思いますが、マイクロソフトのアプリケーションではどうやっているのかと興味を持つ方もいらっしゃると思います。ちょうど、Aaron Stebner's WebLog?で「Pre-installation checks performed by .NET Framework 2.0 setup」と題した投稿がありました。これは .NET Framework 2.0 のセットアップが行っているチェック事項とその方法を紹介したものであり、多くの Windows アプリケーション開発者の方に参考になると思いますので、ここでざっとポイントだけを紹介します。
セットアップが単一のインスタンスしか起動されていないかの確認
つまり、同時に2つ以上のセットアップが起動されていないかどうかの確認ですが、.NET Framework 2.0 ではセットアップの最初で Mutex を取得しており、それによりほかにセットアップを起動しているプロセスがいないかどうかを判断しています。
管理者権限の有無の確認
.NET Framework 2.0 では KB118626 に記されている内容にしたがって、管理者権限の有無を確認しています。
OS バージョンチェック
OS のバージョンチェックには GetVersionEx() を使っています。もし、OSVERSIONINFO 構造体の dwPlatformId メンバーが VER_PLATFORM_WIN32_WINDOWS だったならば、OS は Windows 9x なので、バージョンチェックは終了です(Windows 9x をサポートしないため)。
dwPlatformId が VER_PLATFORM_WIN32_NT だったならば、OSVERSIONINFO の dwMajorVersion と dwMinorVersion メンバーを確認します。
dwMajorVersion が5より小さいならば、Windows NT 4.0 以前の OS であることがわかります(.NET Framework 2.0 では Windows NT 4.0 以前の OS はサポートしないので、ここでセットアップは終了です)。
dwMajorVersion が5以上ならば、Windows 2000 以降の OS であることがわかります。正確に OS のバージョンを把握するには、以下のように dwMajorVersion と dwMinorVersion を使って判断します。
- Windows 2000: dwMajorVersion =5 かつ dwMinorVersion =0 の場合
- Windows XP: dwMajorVersion =5 かつ dwMinorVersion =1 の場合
- Windows Server 2003: dwMajorVersion=5 かつ dwMinorVersion =2 の場合
- Windows Vista 以降: dwMajorVersion=6
64ビット OS チェック
64ビット OS かどうかの判断が必要なのは、32ビット版のアプリケーションが WOW64 環境で動作していないかを判断するときです。.NET Framework 2.0 の場合は、32ビット版と64ビット版の両方が用意されているので、64ビット OS では64ビット版の .NET Framework をインストールする必要があります。
このチェックのためには、GetSystemWow64Directory() を呼びだします。この呼び出しが成功し、適切なパスが返ってきたならば、現在、64ビット OS で WOW64 環境で動作していることがわかります。
逆に、32ビット環境で64ビットのアプリケーションのインストールを試みた場合への対処は特に必要ありません。なぜならば、32ビット環境では64ビットアプリケーション(インストーラー)は動作しないからです。
Windows インストーラーのバージョンチェック
Windows インストーラーのバージョンをチェックするには、まず、次のレジストリを確認することで、MSI.DLL の場所を特定します。
- キー名前: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer
- 値の名前: InstallerLocation
- 値のデータタイプ: REG_SZ
セットアップは次にここで得られた MSI.DLL のパス名を元に、実際に DLL をロードし、DLLGetVersion() によってバージョンを取得します。
すでに同一アプリケーションがインストールされていないかのチェック
すでに同一アプリケーションがインストールされていないかのチェックには、MSI のプロダクトコードを取りだして、それを MsiQueryProductState() に渡します。INSTALLSTATE_DEFAULT が返却されたら、新しくアプリケーションをインストールするのではなく、構成変更モードに入ることになります。
そのほかのチェック
そのほかにも「Pre-installation checks performed by .NET Framework 2.0 setup」の投稿では、.NET Framework 2.0 が OS の一部としてすでにインストールされていないか(現段階では、その可能性があるのは、Windows Vista だけですが)や IE のバージョンチェック、以前のベータ版がインストールされていないかのチェックなどについて紹介されています。
Windows Vista に向けてのアプリケーション開発でも、Windows XP や Windows Server 2003 といった OS もサポートするケースは多いでしょう。また、Windows インストーラーなどのほかコンポーネントのバージョンに依存がある場合も多いと思います。アプリケーションのセットアップの作法はいろいろなところで紹介されていますので、「Pre-installation checks performed by .NET Framework 2.0 setup」で紹介されているのが絶対ではないと思います。ですが、マイクロソフトの代表的なソフトウェアである .NET Framework がセットアップ時にどのようなチェックをしているかを知ることは、皆様のアプリケーション開発の参考にきっとなるでしょう。
マイクロソフト
及川卓也