Ejemplo de base de datos y revisión
Una aplicación puede usar la función MsiOpenDatabase para abrir una base de datos de instalación nueva o existente (archivo.msi) o un paquete de revisión (archivo.msp). La aplicación comprueba el valor devuelto de MsiOpenDatabase antes de usar el identificador de base de datos.
En los ejemplos siguientes se usan las variables de tipo PMSIHANDLE definidas en msi.h. Se recomienda usar el tipo de PMSIHANDLE de porque el instalador cierra objetos de PMSIHANDLE a medida que salen del ámbito, mientras que la aplicación debe cerrar objetos MSIHANDLE llamando a MsiCloseHandle. Para obtener más información, vea la sección Usar PMSIHANDLE en lugar de HANDLE en la Procedimientos recomendados de Windows Installer.
En el ejemplo siguiente se abre una base de datos, sample.msi, solo para lectura. msiOpenDatabase solo se realiza correctamente si sample.msi existe en el directorio c:\test. Tras el éxito, el identificador de base de datos devuelto se puede usar para consultar los datos del paquete de instalación mediante MsiDatabaseOpenView y MsiGetSummaryInformation.
PMSIHANDLE hDbReadOnly = 0;
UINT uiStatus1 = MsiOpenDatabase(TEXT("c:\\test\\sample.msi"), MSIDBOPEN_READONLY, &hDbReadOnly);
if (ERROR_SUCCESS != uiStatus1)
{
// process error
return uiStatus1;
}
En el ejemplo siguiente se abre la base de datos para leer y escribir. Si la aplicación llama a MsiDatabaseCommit, se guardan todos los cambios realizados en la base de datos. Si la aplicación no llama a MsiDatabaseCommit, no se realizan cambios en la base de datos.
PMSIHANDLE hDbTransact = 0;
UINT uiStatus2 = MsiOpenDatabase(TEXT("c:\\test\\example.msi"), MSIDBOPEN_TRANSACT, &hDbTransact);
if (ERROR_SUCCESS != uiStatus2)
{
// process error
return uiStatus2;
}
En el ejemplo siguiente se toma una base de datos existente, text.msiy se crea una nueva base de datos, newtest.msi. Los cambios realizados se pueden guardar en la nueva base de datos llamando a MsiDatabaseCommit. La base de datos existente especificada en el parámetro szDatabasePath no cambia.
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;
}
En el ejemplo siguiente se abre un paquete de revisión de Windows Installer (archivo.msp) para leer solo. El identificador de revisión devuelto se puede usar para determinar los gabinetes y transformar substorages incluidos en el paquete de revisión mediante consultas en las tablas _Streams y _Storages.
Windows Installer 2.0: no se admite. A partir de Windows Installer 3.0, la aplicación puede consultar la tabla msiPatchSequence presente en un paquete de revisión que usa la nueva información de secuenciación de revisiones.
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;
}