預覽處理常式和殼層預覽主機
選取專案以顯示檢視讀取窗格中檔案內容的輕量型、豐富 、唯讀 預覽時,會呼叫預覽處理常式。 這不需要啟動檔案的相關聯應用程式即可完成。
本主題討論下列主題:
預覽處理常式架構
預覽處理常式是裝載的應用程式。 主機包含 Windows Vista 或 Microsoft Outlook 2007 中的 Windows 檔案總管。 主機會實作 IPreviewHandlerFrame 作為預覽處理常式與主機之間的通訊方法。
預覽處理常式本身會實作下列介面:
您的處理常式是透過其 IObjectWithSite呼叫,它會傳回 IUnknown 指標,而您要求 IPreviewHandlerFrame 物件與主機互動。
伺服器模型選項
預覽處理常式一律會用盡進程。 實作此動作的方法有兩種:
- 預覽處理常式可以建置為同進程伺服器,但會透過跨進程代理主機執行。 這是慣用的方法。 系統會在 Prevhost.exe 檔案中提供這個 的代理主機。 此方法所建置的預覽處理常式與 Windows XP 上的 Outlook 2007 不相容。 不過,這些相同的處理常式會在 Windows Vista 上執行的 Windows 檔案總管和 Outlook 2007 中運作。
- 預覽處理常式可以建置為本機組件物件模型, (COM) 伺服器。 基於數個原因,不建議這麼做。 首先,處理中的伺服器實作比較容易。 更重要的是,實作為同進程伺服器可提供處理常式物件存留期更大的控制權,這可提供更好的清除和效率。
根據預設,預覽處理常式會在低完整性層級中執行, (IL) 程式的安全性考慮。 您可以選擇性地停用以低 IL 進程執行,方法是在登錄中設定下列值。 不過,不建議這麼做。 系統最終可能會設定為拒絕不低 IL 的任何進程。
HKEY_CLASSES_ROOT
CLSID
{YOUR HANDLER'S CLSID}
DisableLowILProcessIsolation [DWORD] = 1
根據預設,不同的預覽處理常式會共用相同的進程。 Prevhost.exe的兩個實例可以同時執行;一個用於執行為低 IL 進程的處理常式,一個用於已退出宣告該行為的處理常式。
初始化
如同縮圖和屬性處理常式,強烈建議您使用資料流程初始化處理常式。 您可以視需要透過檔案或專案初始化,但資料流程會提供最安全的方式來實作處理常式。 透過資料流程初始化可確保檔案完整性和穩定性優點,讓執行處理常式的系統成為低 IL 進程,例如保護系統免于緩衝區滿溢、限制處理常式可以寫入資訊的位置,以及限制與其他視窗的通訊。
如果您必須使用檔案或 Shell 專案初始化,請儲存 IShellItem的檔案路徑或參考。 呼叫 IPreviewHandler::D oPreview 之前,請勿從這些來源讀取資料。
一般而言,初始化不應該執行任何繁重的工作,例如撰寫和儲存預覽影像。 為了達到最佳效率,在呼叫預覽之前,不應該完成該類型的處理。
預覽處理常式資料流程
預覽程式中的資料流程遵循此處所示的一般路徑。 主機可以視為 Windows Vista 或 Outlook 2007 中的 Windows 檔案總管。
- 預覽處理常式會初始化,最好是使用資料流程。
- 檢視視窗會透過 IPreviewHandler::SetWindow從主機傳遞至處理常式。
- 此時,處理常式應該不會再執行任何動作,直到呼叫 IPreviewHandler::D oPreview 為止。
- 預覽會顯示在讀取窗格中,透過 呼叫 IPreviewHandler::D oPreview。
- 視窗的大小是透過 IPreviewHandler::SetRect 設定。
- 視窗會視需要透過 IPreviewHandler::SetRect 重設大小。
- 預覽會透過呼叫 IPreviewHandler::Unload卸載,並在不再需要預覽時釋出其資源。
偵錯預覽處理常式
如果您已遵循建議,將預覽處理常式實作為同進程伺服器,若要對預覽處理常式進行偵錯,您可以附加至 Prevhost.exe。 如先前所述,請注意,Prevhost.exe可能有兩個實例,一個用於一般低 IL 進程,另一個用於已選擇不執行為低 IL 進程的處理常式。
如果您在可用進程清單中找不到Prevhost.exe,可能尚未在該時間點載入。 按一下預覽的檔案會載入 Surrogate,然後它應該會顯示為可附加的程式。
為預覽處理常式提供您自己的程式
如果您想要強制為處理常式建立新的進程,而不是在預設進程下執行,請在 AppID 下為處理常式建立新的子機碼,並將其 DllSurrogate 專案設定為 「Prevhost.exe」。 使用該 AppID 子機碼,而不是預設Prevhost.exe AppID。
藉由提供新的進程,處理常式可以避免在共用進程下執行,因為預設會如此。 例如,這可讓您確保程式中特定版本的 Common Language Runtime (CLR) 。 如果您要建置預覽處理常式的 Managed 實作,則需要此專案。
注意
在 64 位作業系統上安裝時,32 位預覽處理常式應該使用 AppID {534A1E02-D58F-44f0-B58B-36CBED287C7C} 。
相關主題