Udostępnij za pośrednictwem


Przykład bazy danych i poprawek

Aplikacja może użyć funkcji MsiOpenDatabase, aby otworzyć nową lub istniejącą bazę danych instalacyjnych (plik.msi) lub pakiet poprawek (plik msp). Aplikacja sprawdza wartość zwracaną MsiOpenDatabase przed użyciem uchwytu bazy danych.

W poniższych przykładach użyto zmiennych typu PMSIHANDLE zdefiniowanych w pliku msi.h. Zaleca się użycie typu PMSIHANDLE, ponieważ instalator zamyka obiekty PMSIHANDLE, ponieważ wykraczają poza zakres, podczas gdy aplikacja musi zamknąć obiektów MSIHANDLE przez wywołanie MsiCloseHandle. Aby uzyskać więcej informacji, zobacz sekcję Use PMSIHANDLE zamiast HANDLE w Windows Installer Best Practices.

Poniższy przykład otwiera bazę danych, sample.msi, do odczytu tylko. MsiOpenDatabase kończy się powodzeniem tylko wtedy, gdy sample.msi istnieje w katalogu c:\test. Po pomyślnym zakończeniu zwracany uchwyt bazy danych może służyć do wykonywania zapytań dotyczących danych w pakiecie instalacyjnym przy użyciu MsiDatabaseOpenView i MsiGetSummaryInformation.

PMSIHANDLE hDbReadOnly = 0;
UINT uiStatus1 = MsiOpenDatabase(TEXT("c:\\test\\sample.msi"), MSIDBOPEN_READONLY, &hDbReadOnly);
if (ERROR_SUCCESS != uiStatus1)
{
    // process error
    return uiStatus1;
}

Poniższy przykład otwiera bazę danych do odczytu i zapisu. Jeśli aplikacja wywołuje MsiDatabaseCommit, wszystkie zmiany wprowadzone w bazie danych zostaną zapisane. Jeśli aplikacja nie wywołuje MsiDatabaseCommit, żadne zmiany nie zostaną wprowadzone w bazie danych.

PMSIHANDLE hDbTransact = 0;
UINT uiStatus2 = MsiOpenDatabase(TEXT("c:\\test\\example.msi"), MSIDBOPEN_TRANSACT, &hDbTransact);
if (ERROR_SUCCESS != uiStatus2)
{
    // process error
    return uiStatus2;
}

Poniższy przykład przyjmuje istniejącą bazę danych, text.msii tworzy nową bazę danych newtest.msi. Wszelkie wprowadzone zmiany można zapisać w nowej bazie danych, wywołując MsiDatabaseCommit. Istniejąca baza danych określona w parametrze szDatabasePath jest niezmieniona.

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

Poniższy przykład otwiera pakiet poprawek Instalatora Windows (plik msp) do odczytu tylko. Zwrócony uchwyt poprawek może służyć do określania szafek i podstorażów przekształcania uwzględnionych w pakiecie poprawek przez zapytania w tabelach _Streams i _Storages.

Instalator Windows 2.0: Nieobsługiwane. Począwszy od Instalatora Windows 3.0, aplikacja może wykonywać zapytania dotyczące tabeli MsiPatchSequence obecnej w pakiecie poprawek, który używa nowych informacji sekwencjonowania poprawek.

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