Partilhar via


Um exemplo de banco de dados e patch

Um aplicativo pode usar a funçãoMsiOpenDatabase para abrir um banco de dados de instalação novo ou existente (arquivo.msi) ou pacote de patch (arquivo .msp). O aplicativo verifica o valor de retorno de MsiOpenDatabase antes de usar o identificador de banco de dados.

Os exemplos a seguir usam o PMSIHANDLE variáveis de tipo definidas em msi.h. É recomendável usar o tipo de PMSIHANDLE porque o instalador fecha objetos PMSIHANDLE à medida que eles saem do escopo, enquanto seu aplicativo deve fechar objetos MSIHANDLE chamando MsiCloseHandle. Para obter mais informações, consulte seção Usar PMSIHANDLE em vez de HANDLE no de práticas recomendadas doWindows Installer.

O exemplo a seguir abre um banco de dados, sample.msi, apenas para leitura. MsiOpenDatabase terá êxito somente se sample.msi existir no diretório c:\test. Após o êxito, o identificador de banco de dados retornado pode ser usado para consultar os dados no pacote de instalação 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;
}

O exemplo a seguir abre o banco de dados para leitura e gravação. Se o aplicativo chamar MsiDatabaseCommit, todas as alterações feitas no banco de dados serão salvas. Se o aplicativo não chamar MsiDatabaseCommit, nenhuma alteração será feita no banco de dados.

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

O exemplo a seguir usa um banco de dados existente, text.msie cria um novo banco de dados, newtest.msi. Todas as alterações feitas podem ser salvas no novo banco de dados chamando MsiDatabaseCommit. O banco de dados existente especificado no parâmetro szDatabasePath não foi alterado.

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

O exemplo a seguir abre um pacote de patch do Windows Installer (arquivo .msp) para somente leitura. A alça de patch retornada pode ser usada para determinar os gabinetes e transformar subarmazenamentos incluídos no pacote de patch por consultas nas tabelas _Streams e _Storages.

Windows Installer 2.0: Não suportado. A partir do Windows Installer 3.0, o aplicativo pode consultar a tabela MsiPatchSequence presente em um pacote de patch que usa as informações de sequenciamento do novo 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;
}