Beispiel für Datenbank und Patch
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 das Datenbankhand handle verwendet wird.
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 Ihre Anwendung MSIHANDLE-Objekte durch Aufrufen von MsiCloseHandleschließen muss. Weitere Informationen finden Sie im Abschnitt Use PMSIHANDLE instead of HANDLE (Verwenden von PMSIHANDLE anstelle von HANDLE)des Windows Installer Best Practices .
Im folgenden Beispiel wird eine Datenbank ( sample.msi nur zum Lesen geöffnet. MsiOpenDatabase ist nur erfolgreich, sample.msi im Verzeichnis c: \ test vorhanden ist. Bei Erfolg kann das zurückgegebene Datenbankhandler verwendet werden, um die Daten im Installationspaket mit msiDatabaseOpenView und MsiGetSummaryInformation abfragt.
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 an der Datenbank vorgenommenen Änderungen 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 es wird eine neue Datenbank erstellt, newtest.msi. Alle vorgenommenen Änderungen können durch Aufrufen von MsiDatabaseCommitin der neuen Datenbank gespeichert werden. Die vorhandene Datenbank, die im szDatabasePath-Parameter angegeben ist, bleibt 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) nur zum Lesen geöffnet. Das zurückgegebene Patchhand handle kann verwendet werden, um die im Patchpaket enthaltenen _ Schränke zu bestimmen und Teilspeicher durch Abfragen der Tabellen Streams _ Storages zu transformieren.
Windows Installer 2.0: Nicht unterstützt. Ab Windows Installer 3.0 kann die Anwendung die MsiPatchSequence-Tabelle abfragen, die in einem Patchpaket vorhanden ist, das die neuen Informationen zur Patchsequenzierung 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;
}