如何建立圖示處理常式

檔案類型通常會有與其相關聯的自訂圖示,以在 Windows 檔案總管中輕鬆辨識其成員。 將自訂圖示指派給檔案類型的最簡單方式是註冊圖示的檔案。 不過,以這種方式註冊的圖示將會與檔案類型的所有成員相同。 您可以藉由實作 圖示處理常式,更有彈性地將圖示指派給檔案類型的成員。

圖示處理常式是殼層延伸模組處理常式的類型,可讓您動態指派圖示給檔案類型的成員。 每次顯示類型的檔案時,Shell 會查詢處理常式以取得適當的圖示。 例如,圖示處理常式可以將不同的圖示指派給檔案類型的不同成員,或根據檔案的目前狀態來變更圖示。

建立 殼層延伸模組處理常式中會討論實作和註冊 Shell 延伸模組處理常式的一般程式。 本檔著重于圖示處理常式特有的實作層面。

指示

步驟 1:實作圖示處理常式

就像所有殼層擴充處理常式一樣,圖示處理常式是同進程元件物件模型, (COM) 實作為 DLL 的物件。 除了 IUnknown之外,它們還必須匯出兩個介面: IPersistFileIExtractIcon

Shell 會透過其 IPersistFile 介面初始化處理常式。 它會使用此介面來要求處理常式的類別識別碼, (CLSID) 並提供檔案名。 其餘作業會透過 IExtractIcon 介面進行。 如需如何實作殼層擴充處理常式的一般討論,包括 IPersistFile 介面,請參閱 建立殼層擴充處理常式。 本檔的其餘部分將討論如何實作 IExtractIcon 介面。

步驟 2:實作 IExtractIcon 介面

初始化介面之後,Shell 會使用處理程式的 IExtractIcon 介面來要求適當的圖示。 介面有兩種方法: IExtractIcon::GetIconLocationIExtractIcon::Extract

圖示會以其在檔案系統中的位置來識別。 系統會呼叫 IExtractIcon::GetIconLocation方法來要求此資訊。 將 szIconFile 參數設定為檔案名。 如果檔案中有多個圖示,請將 piIndex 設定為圖示的索引。 將適當的值指派給兩個旗標變數。 如果您不想指定檔案名,或不想讓殼層擷取圖示,請在pwFlags參數中設定GIL_NOTFILENAME旗標。 您不需要將值指派給 szIconFile,但處理常式必須在 Shell 呼叫 IExtractIcon::Extract時提供圖示控制碼。

如果您傳回檔案名,Shell 通常會嘗試從其快取載入圖示。 若要防止載入快取的圖示,請在pwFlags參數中設定GIL_DONTCACHE旗標。 如果未載入快取的圖示,Shell 接著會呼叫 IExtractIcon::Extract 來要求圖示控制碼。

如果檔案和索引是由IExtractIcon::GetIconLocation指定,則會分別傳遞至pszFilenIconIndex參數中的IExtractIcon::Extract。 如果提供檔案名,您的處理常式可以傳回S_FALSE,讓殼層擷取圖示。 否則,您的處理常式必須擷取或產生大型和小型圖示,並將其 HICON 控制碼指派給 phiconLargephiconSmall 參數。 Shell 會將圖示新增至其快取,以加速對處理常式的後續呼叫。

步驟 3:註冊圖示處理常式

當您以靜態方式註冊檔案類型的圖示時,您會在檔案類型的 ProgID 底下建立DefaultIcon子機碼。 其預設值會設定為包含圖示的檔案。 若要註冊圖示處理常式,您仍然必須有 DefaultIcon 子機碼,但其預設值必須設定為 「%1」。 將 IconHandler 子機碼新增至 ProgID 子機碼的 Shellex 子機碼,並將其預設值設定為處理常式 CLSID GUID 的字串形式。 如需如何註冊殼層擴充處理常式的一般討論,請參閱 建立殼層延伸模組處理常式

下列範例會修改 自訂圖示 中的登錄專案,讓 .myp 檔案類型現在使用快捷方式功能表處理常式,而不是靜態定義的圖示。

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
   MyProgram.1
      (Default) = MyProgram Application
      DefaultIcon
         (Default) = %1
      Shellex
         IconHandler
            (Default) = {The handler's CLSID GUID}

建立 Shell 擴充功能處理常式

IPersistFile

IExtractIcon