使用 MsiProcessMessage 將訊息傳送至 Windows Installer

如果呼叫MsiSetExternalUI,則使用MsiProcessMessage所傳送的訊息是INSTALLUI_HANDLER回呼函式所接收的相同訊息。 否則,Windows Installer 會處理訊息。 如需詳細資訊,請參閱 剖析 Windows Installer 訊息

例如,若要傳送具有MB_ICONWARNING圖示和MB_ABORTRETRYCANCEL按鈕INSTALLMESSAGE_ERROR訊息:

PMSIHANDLE hInstall;
PMSIHANDLE hRec;
MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR|MB_ABORTRETRYIGNORE|MB_ICONWARNING), hRec);

其中hInstall是安裝的控制碼,提供給來自 MsiOpenProduct 或 MsiOpenPackage的自訂動作或hProduct柄,而 hRec是包含要格式化之錯誤資訊的記錄。 如需如何執行格式的資訊,請參閱 MsiFormatRecord

根據預設,如果在未指定按鈕類型或圖示類型的情況下傳送INSTALLMESSAGE_ERROR或INSTALLMESSAGE_FATALEXIT訊息,則會使用MB_OK、無圖示和MB_DEFBUTTON1。

Windows Installer 不會在顯示具有MB_ABORTRETRYIGNORE按鈕規格的 MessageBox 時,使用 「Abort」 字串標記 ABORT 按鈕,而是使用 「Cancel」 字串來標記按鈕。 所有錯誤訊息都會避免使用 「Abort」 一詞,而是改用 「Cancel」 一詞。

MsiProcessMessage函式的hRecord參數取決於傳送至MsiProcessMessage的訊息類型。 下列清單詳細說明記錄與訊息類型相關的需求:

INSTALLMESSAGE_FATALEXIT

 

INSTALLMESSAGE_INFO

 

INSTALLMESSAGE_OUTOFDISKSPACE

欄位 描述
0 結果字串格式設定的範本。 如需詳細資訊 ,請參閱 MsiFormatRecord 。 記錄的欄位是針對欄位 1、[2] 用於欄位 2 等,使用 [1] 來參考記錄的欄位。
1 到 n 所有後續欄位都與欄位 0 中範本所參考的欄位直接相關。

 

如果欄位 0 為 Null,則 UI 處理常式收到的字串會格式化為:1: [欄位 1 中的資料] 2: [欄位 2 中的資料] 表示針對記錄的每個欄位,字串會包含欄位編號,後面接著儲存在欄位中的資料。

當 MsiEnableLog、'/l'命令列選項記錄原則指定 'I' 或INSTALLLOGMODE_INFO時,會記錄來自 MsiProcessMessage的資訊訊息。

INSTALLMESSAGE_ERROR

 

INSTALLMESSAGE_WARNING

 

INSTALLMESSAGE_USER

若要使用 Error 資料表中的訊息。

欄位 描述
0 必須是 Null。
1 Error 資料表中的訊息編號。
2 到 n 與 Error 資料表中指定的訊息相關。

 

例如,

欄位 類型 資料
0 字串 null
1 int 1304
2 字串 Myfile.txt

 

從 UI 處理常式收到的結果訊息為:

錯誤 1304。 寫入檔案時發生錯誤:Myfile.txt。 確認您有該目錄的存取權。

如果欄位 0 不是 Null,則會覆寫來自錯誤資料表的訊息。 相反地,欄位 0 範本會決定訊息的格式。

此訊息也可以指定按鈕,包括預設按鈕,以及要與上述訊息搭配使用的圖示。 按鈕和圖示類型會列在 INSTALLUI_HANDLER中。

INSTALLMESSAGE_COMMONDATA

此訊息會傳送至啟用或停用進度對話方塊中的 [取消] 按鈕。

欄位 描述
0 未使用的。
1 2 是指 [取消] 按鈕。
2 值為 1 表示應該會顯示 [取消] 按鈕。 值為 0 表示 [取消] 按鈕應該不可見。

 

例如,若要停用或隱藏 [取消] 按鈕,記錄會顯示如下。

欄位 類型 資料
0 字串 null
1 int 2
2 int 0

 

INSTALLMESSAGE_ACTIONSTART

 

INSTALLMESSAGE_ACTIONDATA

INSTALLMESSAGE_ACTIONSTART記錄會決定 ActionData 記錄的格式。

欄位 描述
0 null
1 動作名稱。 此欄位中的名稱必須是非 Null。
2 動作描述。
3 動作範本。 這用於 ActionData,其訊息會根據此範本進行格式化。

 

請勿在動作範本訊息中參考欄位 0。

INSTALLMESSAGE_ACTIONDATA記錄的格式如下。

欄位 描述
0 null
1 到 n 相依于 ActionText 資料表中所指定之對應INSTALLMESSAGE_ACTIONSTART訊息或範本的欄位 3。

 

例如,INSTALLMESSAGE_ACTIONSTART記錄。

欄位 類型 資料
0 字串 null
1 字串 MyAction
2 字串 這是 「MyAction」 的描述
3 字串 MyAction 範本:field1 資料為 [1]。 欄位 2 資料為 [2]。

 

INSTALLMESSAGE_ACTIONSTART (欄位 3 的範本) 參考欄位 1 和 2,INSTALLMESSAGE_ACTIONDATA記錄應該有 2 個欄位包含保證的資料。 欄位可以是字串或整數位段。

INSTALLMESSAGE_ACTIONDATA記錄。

欄位 類型 資料
0 字串 null
1 int 2
2 字串 MyAction 的 ActionData

 

INSTALLMESSAGE_FILESINUSE

FILESINUSE 記錄是變數長度記錄。

欄位 描述
0 此欄位可以是 Null。 針對使用基本 UI 的安裝,此欄位可能會指定靜態文字,以顯示在FilesInUse 對話方塊ListBox 控制項中。 對於使用完整 UI 的安裝,此欄位沒有任何作用,因為文字是由自訂 FilesInUse 對話方塊的撰寫所指定。
1 使用中檔案的名稱。
2 此欄位會識別保存使用中檔案的程式。Windows Installer 4.0 版: 進程識別碼 (處理常式的 PID) ,或進程的視窗標題。
Windows Installer 3.1 版和更早版本: 此欄位必須是進程 (PID) 的進程識別碼。

 

例如,若要傳送 FilesInUse 訊息,其中顯示使用中的兩個檔案,red.exe和blue.exe,記錄有四個欄位加上 0 個欄位。 記錄的格式如下表所示。 此範例需要 Windows Installer 4.0 版。

Windows Installer 3.1 版和更早版本: 下列範例中的欄位 2 和 4 必須包含保存red.exe和使用中blue.exe之進程的 PID。

欄位 描述
0 null
1 Red.exe
2 紅色視窗標題
3 Blue.exe
4 藍色視窗標題

 

注意

在 Windows Installer 4.0 版上,如果從服務傳遞的 PID 沒有視窗標題,例如系統匣應用程式,則不會顯示檔案,而且詳細資訊記錄檔包含下列訊息。

 

File In Use: -<FileName>- Window could not be found. Process ID: <PID>
No window with title could be found for FilesInUse

INSTALLMESSAGE_RESOLVESOURCE

INSTALLMESSAGE_RESOLVESOURCE記錄有七個欄位。 若要讓INSTALLMESSAGE_RESOLVESOURCE正常運作,外部 UI 處理常式可能無法處理INSTALLMESSAGE_RESOLVESOURCE訊息。 Windows Installer 必須處理INSTALLMESSAGE_RESOLVESOURCE訊息。 也就是說,外部 UI 處理常式會傳回 0,指出篩選INSTALLMESSAGE_RESOLVESOURCE訊息時,不會採取任何動作。 最佳做法是避免傳送 RESOLVESOURCE 訊息。

欄位 描述
0 null
1 null
2 封裝名稱。
3 產品代碼。
4 如果已知,相對路徑可以是 null。
5 0
6 是否要驗證封裝程式碼。 值 '1' 表示應該驗證封裝程式碼。 值為 '0' 表示不應該驗證封裝。
7 媒體資料表的必要磁片。 值為 '0' 表示任何磁片都是可接受的。