Datenbank- und Patchbeispiel

Eine Anwendung kann die MsiOpenDatabase-Funktion verwenden, um eine neue oder vorhandene Installationsdatenbank (MSI-Datei) oder ein Patchpaket (MSP-Datei) zu öffnen. Die Anwendung überprüft den Rückgabewert von MsiOpenDatabase , bevor sie das Datenbankhandle verwendet.

In den folgenden Beispielen werden die in msi.h definierten PMSIHANDLE-Typvariablen verwendet. Es wird empfohlen, dass Ihre Anwendung den PMSIHANDLE-Typ verwendet, da das Installationsprogramm PMSIHANDLE-Objekte schließt, wenn sie den Bereich verlassen, während Ihre Anwendung MSIHANDLE-Objekte durch Aufrufen von MsiCloseHandle schließen muss. Weitere Informationen finden Sie im Abschnitt Verwenden von PMSIHANDLE anstelle von HANDLE im Abschnitt Bewährte Methoden für Windows Installer.

Im folgenden Beispiel wird eine Datenbank sample.msi zum Lesen geöffnet. MsiOpenDatabase ist nur erfolgreich, wenn sample.msi im Verzeichnis c:\test vorhanden ist. Bei Erfolgreicher Ausführung kann das zurückgegebene Datenbankhandle verwendet werden, um die Daten im Installationspaket mithilfe von MsiDatabaseOpenView und MsiGetSummaryInformation abzufragen.

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

Im folgenden Beispiel wird die Datenbank zum Lesen und Schreiben geöffnet. Wenn die Anwendung MsiDatabaseCommit aufruft, werden alle Änderungen an der Datenbank gespeichert. Wenn die Anwendung MsiDatabaseCommit nicht aufruft, werden keine Änderungen an der Datenbank vorgenommen.

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

Im folgenden Beispiel wird eine vorhandene Datenbank text.msi und eine neue Datenbank erstellt, newtest.msi. Alle vorgenommenen Änderungen können in der neuen Datenbank gespeichert werden, indem MsiDatabaseCommit aufgerufen wird. Die vorhandene Datenbank, die im Parameter szDatabasePath angegeben ist, ist unverändert.

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

Im folgenden Beispiel wird ein Windows Installer-Patchpaket (MSP-Datei) zum Lesen geöffnet. Das zurückgegebene Patchhandle kann verwendet werden, um die im Patchpaket enthaltenen Schränke und Transformationsunterspeicher durch Abfragen für die Tabellen _Streams und _Storages zu bestimmen.

Windows Installer 2.0: Nicht unterstützt. Ab Windows Installer 3.0 kann die Anwendung die MsiPatchSequence-Tabelle in einem Patchpaket abfragen, das die neuen Patchsequenzierungsinformationen verwendet.

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