共用方式為


如何建立圖示處理程式

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

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

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

指示

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

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

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

步驟 2:實作 IExtractIcon 介面

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

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

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

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

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

當您 靜態註冊 文件類型的圖示 時,您會在文件類型的 ProgID 下建立 DefaultIcon 子機碼。 其預設值會設定為包含圖示的檔案。 若要註冊圖示處理程式,您仍然必須有 DefaultIcon 子機碼,但其預設值必須設定為 “%1”。 將 IconHandler 子機碼新增至 ProgID 子機碼的 Shellex 子機碼,並將其預設值設定為處理程式 CLSID GUID 的字元串形式。 如需一般討論如何註冊 Shell 擴充處理程序,請參閱 建立 Shell 擴充處理程序

下列範例會修改 自定義圖示 的登錄專案,讓 .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