Condividi tramite


Esempio di database e patch

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

Negli esempi seguenti vengono usate le variabili di tipo PMSIHANDLE definite in msi.h. È consigliabile usare il tipo PMSIHANDLE perché il programma di installazione chiude gli oggetti PMSIHANDLE quando escono dall'ambito, mentre l'applicazione deve chiudere gli oggetti MSIHANDLE chiamando MsiCloseHandle. Per altre informazioni, vedere Usare PMSIHANDLE anziché la sezione HANDLE in Procedure consigliate per 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. Al termine, 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, tutte le modifiche apportate al database vengono salvate. 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;
}

L'esempio seguente accetta un database esistente, text.msi e crea un nuovo database newtest.msi. Tutte le modifiche apportate possono essere salvate nel nuovo database chiamando MsiDatabaseCommit. Il database esistente specificato nel parametro szDatabasePath rimane 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 gli archivi e trasformare le sottostorage incluse nel pacchetto patch tramite 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;
}