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


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

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

В следующих примерах используются переменные типа PMSIHANDLE, определенные в msi.h. Рекомендуется использовать тип PMSIHANDLE, так как установщик закрывает объекты PMSIHANDLE при выходе из области, в то время как приложение должно закрыть объекты MSIHANDLE путем вызова MsiCloseHandle. Дополнительные сведения см. в разделе Use 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;
}