預覽處理常式和殼層預覽主機

選取專案以顯示檢視讀取窗格中檔案內容的輕量型、豐富 、唯讀 預覽時,會呼叫預覽處理常式。 這不需要啟動檔案的相關聯應用程式即可完成。

本主題討論下列主題:

預覽處理常式架構

預覽處理常式是裝載的應用程式。 主機包含 Windows Vista 或 Microsoft Outlook 2007 中的 Windows 檔案總管。 主機會實作 IPreviewHandlerFrame 作為預覽處理常式與主機之間的通訊方法。

預覽處理常式本身會實作下列介面:

您的處理常式是透過其 IObjectWithSite呼叫,它會傳回 IUnknown 指標,而您要求 IPreviewHandlerFrame 物件與主機互動。

伺服器模型選項

預覽處理常式一律會用盡進程。 實作此動作的方法有兩種:

  1. 預覽處理常式可以建置為同進程伺服器,但會透過跨進程代理主機執行。 這是慣用的方法。 系統會在 Prevhost.exe 檔案中提供這個 的代理主機。 此方法所建置的預覽處理常式與 Windows XP 上的 Outlook 2007 不相容。 不過,這些相同的處理常式會在 Windows Vista 上執行的 Windows 檔案總管和 Outlook 2007 中運作。
  2. 預覽處理常式可以建置為本機組件物件模型, (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 檔案總管。

  1. 預覽處理常式會初始化,最好是使用資料流程。
  2. 檢視視窗會透過 IPreviewHandler::SetWindow從主機傳遞至處理常式。
  3. 此時,處理常式應該不會再執行任何動作,直到呼叫 IPreviewHandler::D oPreview 為止。
  4. 預覽會顯示在讀取窗格中,透過 呼叫 IPreviewHandler::D oPreview
  5. 視窗的大小是透過 IPreviewHandler::SetRect 設定
  6. 視窗會視需要透過 IPreviewHandler::SetRect 重設大小。
  7. 預覽會透過呼叫 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} 。

 

建置預覽處理常式

如何註冊預覽處理常式

預覽處理常式指導方針