Um exemplo de banco de dados e de patch
Um aplicativo pode usar a função MsiOpenDatabase para abrir um banco de dados de instalação novo ou existente (arquivo .msi) ou um pacote de patch (arquivo .msp). O aplicativo verifica o valor retornado de MsiOpenDatabase antes de usar o identificador de banco de dados.
Os exemplos a seguir usam as variáveis de tipo PMSIHANDLE definidas em msi.h. Recomendamos usar o tipo PMSIHANDLE, porque o instalador fecha os objetos PMSIHANDLE conforme eles saem do escopo, enquanto seu aplicativo precisa fechar os objetos MSIHANDLE chamando MsiCloseHandle. Para obter mais informações, confira a seção Use PMSIHANDLE em vez de HANDLE nas Melhores práticas do Windows Installer.
O exemplo a seguir abre um banco de dados, sample.msi, somente para leitura. MsiOpenDatabase só será bem-sucedido se o exemplo de .msi existir no diretório c:\test. Após o sucesso, o identificador de banco de dados retornado pode ser usado para consultar os dados do 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.msi, e cria um banco de dados, newtest.msi. Todas as alterações feitas podem ser salvas no novo banco de dados com uma chamada a MsiDatabaseCommit. O banco de dados existente especificado no parâmetro szDatabasePath não é 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) somente para leitura. O identificador de patch retornado pode ser usado para determinar os gabinetes e transformar as subconsultas incluídas no pacote de patch por consultas nas tabelas _Streams e _Storages.
Windows Installer 2.0: sem suporte. A partir do Windows Installer 3.0, o aplicativo pode consultar a tabela MsiPatchSequence presente em um pacote de patch que usa as novas informações de sequenciamento de 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;
}