Um exemplo de banco de dados e patch
Um aplicativo pode usar a função MsiOpenDatabase para abrir um banco de dados de instalação novo ou existente (.msi arquivo) 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. É 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 Usar PMSIHANDLE em vez da seção HANDLE no de Práticas Recomendadas do Instalador do Windows.
O exemplo a seguir abre um banco de dados, sample.msi, somente para leitura. msiOpenDatabase só terá êxito se sample.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 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 do permanece inalterado.
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 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 presentes 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;
}