データベースとパッチの例

アプリケーションでは、MsiOpenDatabase 関数を使用して、新規または既存のインストール データベース (.msi ファイル) またはパッチ パッケージ (.msp ファイル) を開くことができます。アプリケーションは、データベース ハンドルを使用する前に、MsiOpenDatabase の戻り値をチェックします。

次の例では、msi.h で定義されている PMSIHANDLE 型の変数を使用します。 インストーラーはスコープ外になると PMSIHANDLE オブジェクトを閉じるのに対し、アプリケーションでは MsiCloseHandle を呼び出して MSIHANDLE オブジェクトを閉じる必要があるため、PMSIHANDLE 型を使用することをお勧めします。 詳細については、「Windows インストーラーのベスト プラクティス」の「HANDLE の代わりに PMSIHANDLE を使用する」セクションを参照してください。

次の例では、読み取り専用のデータベース sample.msi を開きます。 MsiOpenDatabase は、sample.msi が c:\test ディレクトリに存在する場合にのみ成功します。 成功すると、返されたデータベース ハンドルを使用し、MsiDatabaseOpenViewMsiGetSummaryInformation を使用して、インストール パッケージ内のデータに対してクエリを実行できます。

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;
}