資料庫和修補程式範例
應用程式可以使用 MsiOpenDatabase 函式來開啟新的或現有的安裝資料庫 (.msi 檔案) 或修補程式套件 (.msp file.) 應用程式在使用資料庫控制碼之前,會先檢查 MsiOpenDatabase 的傳回值。
下列範例使用 msi.h 中定義的 PMSIHANDLE 類型變數。 建議您使用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;
}