使用 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' 表示任何磁片都是可接受的。 |