MsiProcessMessage を使用した Windows インストーラーへのメッセージの送信

MsiProcessMessage を使用して送信されるメッセージは、MsiSetExternalUI が呼び出された場合に INSTALLUI_HANDLER コールバック関数によって受信されるのと同じメッセージです。 それ以外の場合は、Windows インストーラーがこのメッセージを処理します。 詳細については、「Windows インストーラー メッセージの解析」を参照してください。

たとえば、MB_ICONWARNING アイコンと MB_ABORTRETRYCANCEL ボタンを含む INSTALLMESSAGE_ERROR メッセージを送信するには、次のようにします。

PMSIHANDLE hInstall;
PMSIHANDLE hRec;
MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR|MB_ABORTRETRYIGNORE|MB_ICONWARNING), hRec);

ここで、hInstall は (カスタム アクションに提供された) インストールへのハンドルか、あるいは MsiOpenProduct または MsiOpenPackagehProduct ハンドルであり、hRec は書式設定するエラー情報が含まれているレコードです。 書式設定が実行される方法については、MsiFormatRecord に関するページを参照してください。

既定では、ボタンの種類やアイコンの種類を指定せずに INSTALLMESSAGE_ERROR または INSTALLMESSAGE_FATALEXIT メッセージが送信される場合は、MB_OK、アイコンなし、MB_DEFBUTTON1 が使用されます。

Windows インストーラーでは、MB_ABORTRETRYIGNORE ボタン仕様で MessageBox を表示するときに ABORT ボタンに "中止" という文字列のラベルは付けず、代わりに "キャンセル" という文字列のラベルを付けます。 すべてのエラー メッセージで "中止" という単語の使用を避け、代わりに "キャンセル" という単語を使用します。

MsiProcessMessage 関数の hRecord パラメーターは、MsiProcessMessage に送信されるメッセージの種類によって異なります。 次の一覧は、メッセージの種類に関連するレコードの要件を詳細に示しています。

INSTALLMESSAGE_FATALEXIT

 

INSTALLMESSAGE_INFO

 

INSTALLMESSAGE_OUTOFDISKSPACE

フィールド 説明
0 結果として得られる文字列の書式設定のためのテンプレート。 詳細については、MsiFormatRecord に関するページを参照してください。 レコードのフィールドは、フィールド 1 の場合は [1]、フィールド 2 の場合は [2] などを使用して参照されます。
1 から n 以降のすべてのフィールドは、フィールド 0 のテンプレートによって参照されるフィールドに直接関連付けられます。

 

フィールド 0 が null である場合、UI ハンドラーによって受信される文字列は "1: [フィールド 1 のデータ] 2: [フィールド 2 のデータ]" のように書式設定されます。つまり、レコードの各フィールドの文字列には、フィールド番号の後に、そのフィールドに格納されているデータが含まれています。

MsiProcessMessage からの情報メッセージは、MsiEnableLog、"/l" のコマンド ライン オプション、またはログ ポリシーで "I" または INSTALLLOGMODE_INFO が指定されている場合にログに記録されます。

INSTALLMESSAGE_ERROR

 

INSTALLMESSAGE_WARNING

 

INSTALLMESSAGE_USER

Error テーブルのメッセージを使用する場合。

フィールド 説明
0 null である必要があります。
1 Error テーブル内のメッセージ番号。
2 から n Error テーブル内の指定されたメッセージに関連しています。

 

次に例を示します。

フィールド Type データ
0 string null
1 INT 1304
2 string Myfile.txt

 

UI ハンドラーから受信される結果のメッセージは次のとおりです。

エラー 1304。 ファイル Myfile.txt への書き込み中にエラーが発生しました。 そのディレクトリにアクセスできることを確認してください。

フィールド 0 が null でない場合は、Error テーブルからのメッセージがオーバーライドされます。 代わりに、フィールド 0 のテンプレートによってメッセージの形式が決定されます。

このメッセージではまた、前に説明したメッセージで使用されるボタン (既定のボタンを含む) やアイコンを指定することもできます。 ボタンとアイコンの種類は、INSTALLUI_HANDLER に関するページに記載されています。

INSTALLMESSAGE_COMMONDATA

このメッセージは、進行状況ダイアログ ボックス内の [キャンセル] ボタンを有効または無効にするために送信されます。

フィールド 説明
0 未使用。
1 2 が [キャンセル] ボタンを示します。
2 1 の値は、[キャンセル] ボタンを表示する必要があることを示します。 0 の値は、[キャンセル] ボタンを非表示にする必要があることを示します。

 

たとえば、[キャンセル] ボタンを無効または非表示にするには、レコードを次のようにします。

フィールド Type データ
0 string null
1 INT 2
2 INT 0

 

INSTALLMESSAGE_ACTIONSTART

 

INSTALLMESSAGE_ACTIONDATA

INSTALLMESSAGE_ACTIONSTART レコードによって、ActionData レコードの形式が決定されます。

フィールド 説明
0 null
1 アクション名。 このフィールド内の名前は null 以外である必要があります。
2 アクションの説明。
3 アクション テンプレート。 これは、メッセージがこのテンプレートに従って書式設定されている ActionData に使用されます。

 

アクション テンプレートのメッセージでフィールド 0 を参照しないでください。

INSTALLMESSAGE_ACTIONDATA レコードは、次のように書式設定されます。

フィールド 説明
0 null
1 から n ActionText テーブルで指定されている対応する INSTALLMESSAGE_ACTIONSTART メッセージまたはテンプレートのフィールド 3 に依存します。

 

たとえば、次の INSTALLMESSAGE_ACTIONSTART レコードを考えてみます。

フィールド Type データ
0 string null
1 string MyAction
2 string これは "MyAction" の説明です。
3 string MyAction テンプレート: フィールド 1 のデータは [1]。 フィールド 2 のデータは [2]。

 

INSTALLMESSAGE_ACTIONSTART (フィールド 3) のテンプレートは、フィールド 1 と 2 を参照します。INSTALLMESSAGE_ACTIONDATA レコードには、保証されたデータを含む 2 つのフィールドが必要です。 これらのフィールドは、文字列または整数フィールドのどちらでもかまいません。

INSTALLMESSAGE_ACTIONDATA レコード。

フィールド Type データ
0 string null
1 INT 2
2 string MyAction の ActionData

 

INSTALLMESSAGE_FILESINUSE

FILESINUSE レコードは、可変長のレコードです。

フィールド 説明
0 このフィールドには null を指定できます。 基本的な UI を使用するインストールの場合、このフィールドでは、FilesInUse ダイアログListBox コントロールに表示する静的テキストを指定できます。 完全な UI を使用するインストールの場合は、テキストがカスタム FilesInUse ダイアログ ボックスの作成によって指定されるため、このフィールドは効果がありません。
1 使用中のファイルの名前。
2 このフィールドは、使用中のファイルを保持しているプロセスを識別します。Windows インストーラー バージョン 4.0: そのプロセスのプロセス ID (PID)、またはそのプロセスのウィンドウのタイトル。
Windows インストーラー バージョン 3.1 以前: このフィールドは、そのプロセスのプロセス ID (PID) である必要があります。

 

たとえば、2 つの使用中のファイル red.exe と blue.exe を示す FilesInUse メッセージを送信するには、レコードに 4 つのフィールドに加えてフィールド 0 を含めます。 レコードの形式は、次の表に示すようになります。 この例には、Windows インストーラー バージョン 4.0 が必要です。

Windows インストーラー バージョン 3.1 以前: 次の例のフィールド 2 と 4 には、使用中の red.exe と blue.exe を保持しているプロセスの PID が含まれている必要があります。

フィールド 説明
0 null
1 Red.exe
2 赤いウィンドウ タイトル
3 Blue.exe
4 青いウィンドウ タイトル

 

Note

Windows インストーラー バージョン 4.0 では、サービスから渡された PID にウィンドウ タイトル (システム トレイ アプリケーションなど) がない場合、ファイルは表示されず、詳細ログには次のメッセージが含まれています。

 

File In Use: -<FileName>- Window could not be found. Process ID: <PID>
No window with title could be found for FilesInUse

INSTALLMESSAGE_RESOLVESOURCE

INSTALLMESSAGE_RESOLVESOURCE レコードには 7 つのフィールドがあります。 INSTALLMESSAGE_RESOLVESOURCE を正しく機能させるために、外部 UI ハンドラーは INSTALLMESSAGE_RESOLVESOURCE メッセージを処理しない可能性があります。 Windows インストーラーが INSTALLMESSAGE_RESOLVESOURCE メッセージを処理する必要があります。 つまり、外部 UI ハンドラーは、INSTALLMESSAGE_RESOLVESOURCE メッセージをフィルター処理したときに "アクションが実行されない" ことを示す 0 を返します。 RESOLVESOURCE メッセージの送信を回避することがベスト プラクティスになります。

フィールド 説明
0 null
1 null
2 パッケージ名。
3 製品コード。
4 相対パス (既知の場合)。null を指定できます。
5 0
6 パッケージ コードを検証するかどうか。 "1" の値は、パッケージ コードを検証する必要があることを示します。 "0" の値は、パッケージを検証するべきではないことを示します。
7 メディア テーブルの必要なディスク。 "0" の値は、どのディスクも許容されることを示します。