Condividi tramite


Esempio di database e patch

Un'applicazione può usare la funzionemsiOpenDatabaseper aprire un database di installazione nuovo o esistente (file.msi) o un pacchetto patch (file msp). L'applicazione controlla il valore restituito di MsiOpenDatabase prima di usare l'handle di database.

Gli esempi seguenti usano le variabili di tipo PMSIHANDLE definite in msi.h. È consigliabile usare il tipo di PMSIHANDLE perché il programma di installazione chiude oggetti PMSIHANDLE non rientrano nell'ambito, mentre l'applicazione deve chiudere oggetti MSIHANDLE chiamando MsiCloseHandle. Per altre informazioni, vedere usare PMSIHANDLE anziché la sezione HANDLE nella Procedure consigliate di Windows Installer.

Nell'esempio seguente viene aperto un database, sample.msi, solo per la lettura. MsiOpenDatabase ha esito positivo solo se sample.msi esiste nella directory c:\test. In caso di esito positivo, l'handle di database restituito può essere usato per eseguire query sui dati nel pacchetto di installazione usando MsiDatabaseOpenView e MsiGetSummaryInformation.

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

Nell'esempio seguente viene aperto il database per la lettura e la scrittura. Se l'applicazione chiama MsiDatabaseCommit, vengono salvate tutte le modifiche apportate al database. Se l'applicazione non chiama MsiDatabaseCommit, non vengono apportate modifiche al database.

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

Nell'esempio seguente viene accettato un database esistente, text.msie viene creato un nuovo database, newtest.msi. Tutte le modifiche apportate possono essere salvate nel nuovo database chiamando MsiDatabaseCommit. Il database esistente specificato nel parametro szDatabasePath è invariato.

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

Nell'esempio seguente viene aperto un pacchetto patch di Windows Installer (file msp) per la sola lettura. L'handle di patch restituito può essere usato per determinare i archivi e le sottostorage di trasformazione inclusi nel pacchetto patch dalle query sulle tabelle _Streams e _Storages.

Windows Installer 2.0: Non supportato. A partire da Windows Installer 3.0, l'applicazione può eseguire query sulla tabella MsiPatchSequence presente in un pacchetto patch che usa le nuove informazioni di sequenziazione delle patch.

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