Поделиться через


Пример базы данных и исправлений

Приложение может использовать функцию MsiOpenDatabase для открытия новой или существующей базы данных установки (.msi файла) или пакета исправлений (MSP-файл). Приложение проверяет возвращаемое значение MsiOpenDatabase перед использованием дескриптора базы данных.

В следующих примерах используются переменные типа PMSIHANDLE, определенные в файле msi.h. Рекомендуется использовать тип PMSIHANDLE, так как установщик закрывает объекты PMSIHANDLE по мере их выхода из область, в то время как приложение должно закрывать объекты MSIHANDLE путем вызова MsiCloseHandle. Дополнительные сведения см. в разделе Использование PMSIHANDLE вместо HANDLE статьи Рекомендации установщика Windows.

В следующем примере база данных открывается sample.msi только для чтения. MsiOpenDatabase выполняется успешно, только если sample.msi существует в каталоге c:\test. После успешного выполнения возвращенный дескриптор базы данных можно использовать для запроса данных в пакете установки с помощью MsiDatabaseOpenView и MsiGetSummaryInformation.

PMSIHANDLE hDbReadOnly = 0;
UINT uiStatus1 = MsiOpenDatabase(TEXT("c:\\test\\sample.msi"), MSIDBOPEN_READONLY, &hDbReadOnly);
if (ERROR_SUCCESS != uiStatus1)
{
    // process error
    return uiStatus1;
}

В следующем примере открывается база данных для чтения и записи. Если приложение вызывает MsiDatabaseCommit, все изменения, внесенные в базу данных, сохраняются. Если приложение не вызывает MsiDatabaseCommit, в базу данных не вносятся никакие изменения.

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

В следующем примере используется существующая база данных, text.msi, и создается новая база данных newtest.msi. Любые внесенные изменения можно сохранить в новой базе данных, вызвав MsiDatabaseCommit. Существующая база данных, указанная в параметре szDatabasePath , не изменяется.

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

В следующем примере открывается пакет исправлений установщика Windows (MSP-файл) только для чтения. Возвращенный дескриптор исправления можно использовать для определения шкафов и преобразования вложенных журналов, включенных в пакет исправлений, с помощью запросов к _Streams и _Storages таблицам.

Установщик Windows 2.0: Не поддерживается. Начиная с установщика Windows 3.0, приложение может запрашивать таблицу MsiPatchSequence , присутствующих в пакете исправлений, который использует новые сведения о последовательности исправлений.

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