バージョン情報の使用
通常、インストール プログラムには次の目標があります。
- ファイルを正しい場所に配置します。
- インストール プログラムが既存のファイルを大幅に異なるバージョンに置き換えているかどうかをユーザーに通知するには (たとえば、ドイツ語のファイルを英語のファイルに置き換える、新しいファイルを古いファイルに置き換えるなど)。
インストール・プログラムを作成する場合は、各ファイルについて以下の情報が必要です。
- ファイルの名前と場所 (ソース ファイルと呼ばれます)。
- ユーザーのハード ディスク上の同等のファイルの名前 (コピー先ファイルと呼ばれます)。 この名前は通常、インストール ディスク上のファイル名と同じです。
- ファイルの共有状態。つまり、ファイルがインストールされているアプリケーションに対してプライベートであるか、複数のアプリケーションで共有される可能性があります。
インストール・プログラムは 、VerFindFile 関数を使用して、ディスク上のファイルのコピー先を判別できます。 この関数を使用して、ファイルがアプリケーションに対してプライベートであるか、共有できるかを指定することもできます。 ファイルの検索で問題が発生した場合、 VerFindFile はエラー値を返します。 たとえば、システムが変換先ファイルを使用している場合、 VerFindFile は VFF_FILEINUSEを返します。 インストール・プログラムは、ユーザーに問題を通知し、インストールを続行するか終了するかのユーザーの決定に応答する必要があります。
VerInstallFile 関数は、ソース ファイルを VerFindFile で指定されたディレクトリ内の一時ファイルにコピーします。 必要に応じて、 VerInstallFile はデータ圧縮解除ライブラリの関数を使用してファイルを展開します。
VerInstallFile は 、一時ファイルのバージョン情報とコピー先ファイルのバージョン情報を比較します。 2 つが異なる場合、 VerInstallFile は 1 つ以上のエラー値を返します。 たとえば、一時ファイルがコピー先ファイルより古い場合は VIF_SRCOLD を返し、ファイルの言語識別子またはコード ページ値が異なる場合は VIF_DIFFLANG します。 インストール・プログラムは、ユーザーに問題を通知し、インストールを続行するか終了するかのユーザーの決定に応答する必要があります。
一部の VerInstallFile エラーは回復可能です。 つまり、インストール プログラムは、バージョンの競合に関係なくファイルをインストールするために、VIFF_FORCEINSTALL オプションを指定して VerInstallFile をもう一度呼び出すことができます。 VerInstallFile がVIF_TEMPFILEを返し、ユーザーが強制的にインストールしないことを選択した場合、インストール プログラムは一時ファイルを削除する必要があります。
VerInstallFile では、以前にエラーが存在しなかった場合でも、インストールを強制しようとしたときに回復不可能なエラーが発生する可能性があります。 たとえば、インストール プログラムが強制的にインストールを試行する前に、別のユーザーによってファイルがロックされている可能性があります。 回復不可能なエラーが発生した後にインストール プログラムが強制的にインストールを試みると、 VerInstallFile は失敗します。 インストール・プログラムには、このタイプのエラーから回復するためのルーチンが含まれている必要があります。
推奨される解決策は、[インストール]、[スキップ]、[すべてインストール] ボタンを含むダイアログ ボックスを表示することです。 (もう 1 つの解決策は、[はい]、[はい] から [すべて]、[スキップ]、[キャンセル] の各ボタンを含むダイアログ ボックスです)。[すべてインストール] ボタンをクリックすると、以降のすべての VerInstallFile の使用に VIFF_FORCEINSTALL オプションを含めることで、インストール プログラムが同様のエラーをユーザーに求めないようにする必要があります。 回復不可能なエラーの場合は、[ すべてインストール ] ボタンと [すべてインストール ] ボタンを無効にする必要があります。
ユーザーに役立つエラー メッセージを表示するには、通常、インストール プログラムは競合するファイルのバージョン リソースから情報を取得する必要があります。 この目的のためにインストール プログラムで使用できる機能は 4 つあります。
GetFileVersionInfoSize は、バージョン情報のサイズを返します。 GetFileVersionInfo は、 GetFileVersionInfoSize によって取得された情報を使用して、バージョン情報を含む構造体を取得します。 VerQueryValue は、その構造体から特定のメンバーを取得します。
たとえば、 VerInstallFile が VIF_DIFFTYPE エラーを返す場合、インストール プログラムでは、一時ファイルとコピー先ファイルの GetFileVersionInfoSize、 GetFileVersionInfo、 および VerQueryValue 関数を使用して、各ファイルの一般的な種類を取得する必要があります。 ファイルの言語が競合する場合は、インストール プログラムで VerLanguageName を使用して、バイナリ言語識別子を言語のテキスト表現に変換する必要もあります。 (たとえば、0x040Cは文字列 "French" に変換されます)。
VerInstallFile がVIF_ACCESSVIOLATIONなどのファイル エラーを返す場合、インストール プログラムは GetLastError 関数を使用して最新のエラー値を取得する必要があります。 プログラムは、この値をユーザーに表示するための有益なメッセージに変換する必要があります。 プログラムは、VerInstallFile と GetLastError の呼び出しの間で制御を行う必要があります。