Dela via


Ett databas- och korrigeringsexempel

Ett program kan använda funktionen MsiOpenDatabase för att öppna en ny eller befintlig installationsdatabas (.msi fil) eller korrigeringspaket (.msp-fil.) Programmet kontrollerar returvärdet för MsiOpenDatabase innan du använder databashandtaget.

I följande exempel används variablerna PMSIHANDLE typ som definierats i msi.h. Vi rekommenderar att du använder PMSIHANDLE- eftersom installationsprogrammet stänger PMSIHANDLE objekt när de hamnar utanför omfånget, medan programmet måste stänga MSIHANDLE- objekt genom att anropa MsiCloseHandle. Mer information finns i Använda PMSIHANDLE i stället för AVSNITTET HANTERA i bästa praxis för Windows Installer.

I följande exempel öppnas en databas, sample.msi, för endast läsning. MsiOpenDatabase lyckas endast om sample.msi finns i katalogen c:\test. När det har lyckats kan den returnerade databasreferensen användas för att fråga efter data i installationspaketet med hjälp av MsiDatabaseOpenView och MsiGetSummaryInformation.

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

I följande exempel öppnas databasen för läsning och skrivning. Om programmet anropar MsiDatabaseCommitsparas alla ändringar som görs i databasen. Om programmet inte anropar MsiDatabaseCommitgörs inga ändringar i databasen.

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

Följande exempel tar en befintlig databas, text.msi, och skapar en ny databas, newtest.msi. Ändringar som görs kan sparas i den nya databasen genom att anropa MsiDatabaseCommit. Den befintliga databasen som anges i parametern szDatabasePath är oförändrad.

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

I följande exempel öppnas ett Windows Installer-korrigeringspaket (.msp-fil) för endast läsning. Det returnerade korrigeringshandtaget kan användas för att fastställa skåp och transformera underlagringar som ingår i korrigeringspaketet genom frågor i tabellerna _Streams och _Storages.

Windows Installer 2.0: Stöds inte. Från och med Windows Installer 3.0 kan programmet fråga tabellen MsiPatchSequence finns i ett korrigeringspaket som använder den nya korrigeringssekvensinformationen.

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