データベースとパッチの例
アプリケーションは、MsiOpenDatabase 関数を使用して、新規または既存のインストール データベース (.msi ファイル) またはパッチ パッケージ (.msp ファイル) を開くことができます。アプリケーションは、データベース ハンドルを使用する前 MsiOpenDatabase の戻り値を確認します。
次の例では、msi.h で定義されている PMSIHANDLE 型変数を使用します。 PMSIHANDLE 型を使用することをお勧めします。これは、インストーラーがスコープ外に出ると PMSIHANDLE オブジェクト 閉じるのに対し、アプリケーションは MSICloseHandle呼び出して MSIHANDLE オブジェクト 閉じる必要があるためです。 詳細については、「Windows インストーラーのベスト プラクティス」の「HANDLE の代わりに PMSIHANDLE を使用する」を参照してください。
次の例では、読み取り専用のデータベース (sample.msi) を開きます。 MsiOpenDatabase は、sample.msi が c:\test ディレクトリに存在する場合にのみ成功します。 成功すると、返されたデータベース ハンドルを使用して、MsiDatabaseOpenViewと msiGetSummaryInformation使用して、インストール パッケージ内のデータのクエリを実行できます。
PMSIHANDLE hDbReadOnly = 0;
UINT uiStatus1 = MsiOpenDatabase(TEXT("c:\\test\\sample.msi"), MSIDBOPEN_READONLY, &hDbReadOnly);
if (ERROR_SUCCESS != uiStatus1)
{
// process error
return uiStatus1;
}
次の例では、読み取りと書き込みのためにデータベースを開きます。 アプリケーションが MsiDatabaseCommit呼び出すと、データベースに加えられたすべての変更が保存されます。 アプリケーションが MsiDatabaseCommit 呼び出さない場合、データベースは変更されません。
PMSIHANDLE hDbTransact = 0;
UINT uiStatus2 = MsiOpenDatabase(TEXT("c:\\test\\example.msi"), MSIDBOPEN_TRANSACT, &hDbTransact);
if (ERROR_SUCCESS != uiStatus2)
{
// process error
return uiStatus2;
}
次の例では、既存のデータベースを text.msiし、新しいデータベースを作成 newtest.msi。 加えられた変更は、MsiDatabaseCommitを呼び出すことによって、新しいデータベースに保存できます。 szDatabasePath パラメーターで指定された既存のデータベースは変更されません。
PMSIHANDLE hDbOutput = 0;
UINT uiStatus3 = MsiOpenDatabase(TEXT("c:\\test\\test.msi"), TEXT("c:\\test\\newtest.msi"), &hDbOutput);
if (ERROR_SUCCESS != uiStatus3)
{
// process error
return uiStatus3;
}
次の例では、読み取り専用の Windows インストーラー パッチ パッケージ (.msp ファイル) を開きます。 返されるパッチ ハンドルを使用して、_Streams テーブルと _Storages テーブルに対するクエリによって、パッチ パッケージに含まれるキャビネットを特定し、サブクエリを変換できます。
Windows インストーラー 2.0: サポートされていません。 Windows インストーラー 3.0 以降、アプリケーションは、新しいパッチシーケンス情報を使用するパッチ パッケージに存在 MsiPatchSequence テーブルに対してクエリを実行できます。
PMSIHANDLE hDbPatch = 0;
LPCTSTR szPersistMode = MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE;
UINT uiStatus4 = MsiOpenDatabase(TEXT("c:\\test\\sample.msp"), szPersistMode, &hDbPatch);
if (ERROR_SUCCESS != uiStatus4)
{
// process error
return uiStatus4;
}