Compartir a través de


Ejemplo de base de datos y revisión

Cualquier 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 revisiones (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 PMSIHANDLE, ya que el instalador cierra los objetos PMSIHANDLE a medida que salen del ámbito, mientras que la aplicación debe cerrar objetos MSIHANDLE mediante una llamada a MsiCloseHandle. Para más información, consulte la sección Uso de PMSIHANDLE, en lugar de HANDLE en los procedimientos recomendados de Windows Installer.

En el siguiente ejemplo se abre una base de datos, sample.msi, solo para lectura. MsiOpenDatabase solo se ejecuta correctamente si sample.msi existe en el directorio c:\test. En ese caso, 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.msi, y se crea una base de datos, newtest.msi. Los cambios que se realizan 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 siguiente ejemplo se abre un paquete de revisiones de Windows Installer (archivo .msp) para solo lectura. El identificador de revisión devuelto se puede usar para determinar los armarios y los subalmacenamientos de transformación 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;
}