Freigeben über


Beispiel für Datenbank und Patch

Eine Anwendung kann die MsiOpenDatabase--Funktion verwenden, um eine neue oder vorhandene Installationsdatenbank (.msi Datei) oder patchpaket (MSP-Datei) zu öffnen.) Die Anwendung überprüft den Rückgabewert MsiOpenDatabase-, bevor Sie das Datenbankhandle verwenden.

In den folgenden Beispielen werden die in msi.h definierten PMSIHANDLE Typvariablen verwendet. Es wird empfohlen, den PMSIHANDLE Typ zu verwenden, da das Installationsprogramm PMSIHANDLE Objekte schließt, während sie außerhalb des Gültigkeitsbereichs liegen, während Ihre Anwendung MSIHANDLE- Objekte schließen muss, indem MsiCloseHandleaufgerufen wird. Weitere Informationen finden Sie unter Verwenden von PMSIHANDLE anstelle des Abschnitts HANDLE im bewährte Methoden für Windows Installer.

Im folgenden Beispiel wird eine Datenbank, sample.msi, zum Lesen geöffnet. MsiOpenDatabase nur erfolgreich, wenn sample.msi im Verzeichnis "c:\test" vorhanden ist. Bei Erfolg kann der zurückgegebene Datenbankhandle verwendet werden, um die Daten im Installationspaket mithilfe MsiDatabaseOpenView- und MsiGetSummaryInformationabzufragen.

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 MsiDatabaseCommitaufruft, werden alle an der Datenbank vorgenommenen Änderungen gespeichert. Wenn die Anwendung MsiDatabaseCommitnicht 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.msiverwendet und eine neue Datenbank newtest.msierstellt. Alle vorgenommenen Änderungen können in der neuen Datenbank gespeichert werden, indem MsiDatabaseCommitaufgerufen wird. Die im szDatabasePath Parameter angegebene datenbank 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änken zu bestimmen und Substoragen zu transformieren, indem Abfragen zu den Tabellen _Streams und _Storages.

Windows Installer 2.0: Nicht unterstützt. Ab Windows Installer 3.0 kann die Anwendung die MsiPatchSequence-Tabelle abfragen in einem Patchpaket vorhanden sein, 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;
}