数据库和补丁示例

应用程序可使用 MsiOpenDatabase 函数来打开新的或现有的安装数据库(.msi 文件)或补丁包(.msp 文件)。在使用数据库句柄之前,应用程序会检查 MsiOpenDatabase 的返回值。

以下示例使用 msi.h 中定义的 PMSIHANDLE 类型变量。 建议使用 PMSIHANDLE 类型,因为安装程序会在 PMSIHANDLE 对象超出范围时将其关闭,而应用程序必须通过调用 MsiCloseHandle 来关闭 MSIHANDLE 对象。 有关详细信息,请参阅 Windows Installer 最佳做法中的使用 PMSIHANDLE 而非 HANDLE 部分。

以下示例以只读方式打开数据库 sample.msi。 仅当 c:\test 目录中存在 sample.msi 时,MsiOpenDatabase 才会成功。 成功后,可使用返回的数据库句柄结合 MsiDatabaseOpenViewMsiGetSummaryInformation 来查询安装包中的数据。

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 Installer 补丁包(.msp 文件)。 可使用返回的补丁句柄,通过对 _Streams_Storages 表进行查询来确定补丁包中包含的文件柜和转换子存储。

Windows Installer 2.0:不支持。 从 Windows Installer 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;
}