共用方式為


資料庫和修補程式範例

應用程式可以使用 MsiOpenDatabase 函式來開啟新的或現有的安裝資料庫(.msi 檔案)或修補程式套件 (.msp file.)應用程式會先檢查 MsiOpenDatabase 的傳回值,再使用資料庫句柄。

下列範例使用 PMSIHANDLE msi.h 中定義的類型變數。 建議您使用 PMSIHANDLE 類型,因為安裝程式會在超出範圍時關閉 PMSIHANDLE 物件,而您的應用程式必須藉由呼叫 MsiCloseHandle來關閉 MSIHANDLE 物件。 如需詳細資訊,請參閱 Windows Installer 最佳做法中的 使用 PMSIHANDLE 而非 HANDLE 一節。

下列範例會開啟資料庫 sample.msi,以便唯讀取。 MsiOpenDatabase 只有在 c:\test 目錄中 sample.msi 才會成功。 成功時,傳回的資料庫句柄可用來使用 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;
}