数据库和修补程序示例
应用程序可以使用 MsiOpenDatabase 函数打开新的或现有的安装数据库(.msi 文件)或修补包(.msp 文件)。应用程序在使用数据库句柄之前检查 MsiOpenDatabase 的返回值。
以下示例使用 msi.h 中定义的 PMSIHANDLE 类型变量。 建议使用 PMSIHANDLE 类型,因为安装程序关闭 PMSIHANDLE 对象超出范围,而应用程序必须通过调用 MsiCloseHandle关闭 MSIHANDLE 对象。 有关详细信息,请参阅 Windows Installer 最佳做法中的 使用 PMSIHANDLE 而不是 HANDLE 部分。
以下示例打开一个数据库,sample.msi,以便仅读取。 仅当 c:\test 目录中存在 sample.msi 时,MsiOpenDatabase 才会成功。 成功后,返回的数据库句柄可用于使用 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 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;
}