Delen via


Voorbeeld van een database en patch

Een toepassing kan de functie MsiOpenDatabase gebruiken om een nieuwe of bestaande installatiedatabase (.msi bestand) of patchpakket (.msp-bestand) te openen. De toepassing controleert de retourwaarde van MsiOpenDatabase voordat u de databasehandgreep gebruikt.

In de volgende voorbeelden worden de PMSIHANDLE typevariabelen gebruikt die zijn gedefinieerd in msi.h. Het wordt aanbevolen om het PMSIHANDLE- type te gebruiken omdat het installatieprogramma PMSIHANDLE objecten sluit wanneer deze buiten het bereik vallen, terwijl uw toepassing msihandle objecten moet sluiten door MsiCloseHandle-aan te roepen. Zie PMSIHANDLE gebruiken in plaats van handle in de aanbevolen procedures voor Windows Installervoor meer informatie.

In het volgende voorbeeld wordt een database, sample.msi, geopend voor alleen-lezen. MsiOpenDatabase alleen slaagt als sample.msi bestaat in de map c:\test. Bij succes kan de geretourneerde databasehandgreep worden gebruikt om query's uit te voeren op de gegevens in het installatiepakket met behulp van MsiDatabaseOpenView- en MsiGetSummaryInformation-.

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

In het volgende voorbeeld wordt de database geopend voor lezen en schrijven. Als de toepassing MsiDatabaseCommit-aanroept, worden alle wijzigingen in de database opgeslagen. Als de toepassing geen MsiDatabaseCommit-aanroept, worden er geen wijzigingen aangebracht in de database.

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

In het volgende voorbeeld wordt een bestaande database gebruikt, text.msien wordt een nieuwe database gemaakt, newtest.msi. Wijzigingen die worden aangebracht, kunnen worden opgeslagen in de nieuwe database door MsiDatabaseCommit-aan te roepen. De bestaande database die is opgegeven in de parameter szDatabasePath, is ongewijzigd.

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

In het volgende voorbeeld wordt een Windows Installer-patchpakket (.msp-bestand) geopend voor alleen-lezen. De geretourneerde patchgreep kan worden gebruikt om de cabinets te bepalen en substorages te transformeren die zijn opgenomen in het patchpakket door query's op de _Streams- en _Storages tabellen.

Windows Installer 2.0: Niet ondersteund. Vanaf Windows Installer 3.0 kan de toepassing een query uitvoeren op de tabel MsiPatchSequence aanwezig zijn in een patchpakket dat gebruikmaakt van de nieuwe informatie over patchvolgorde.

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