首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

檔案類型圖示偵測:SHGetFileInfo 取代註冊表解析的最佳實踐

     編輯:關於VC++

問題背景

欲取得特定副檔名(如 .cpp、.txt)關聯的系統圖示。傳統做法需遞迴解析註冊表:

  1. HKCR\.cpp → 預設值 cppfile
  2. HKCR\cppfile\DefaultIcon → 圖示路徑與資源 ID
  3. 若涉及 COM 物件,還需查 CLSID、IExtractIcon 介面……極其繁瑣

最佳解法:SHGetFileInfo

一行 API 解決所有關聯、COM、殼擴展複雜度:

SHFILEINFO sfi = { 0 };
SHGetFileInfo(L"foo.bmp", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi),
    SHGFI_ICON | SHGFI_USEFILEATTRIBUTES);

關鍵旗標

  • SHGFI_USEFILEATTRIBUTES:允許傳入不存在的假檔名,僅依副檔名查詢關聯圖示
  • SHGFI_ICON:回傳圖示句柄於 sfi.hIcon
  • SHGFI_LARGEICON / SHGFI_SMALLICON:指定尺寸
  • SHGFI_SYSICONINDEX:取得系統映像清單索引,配合 CImageList 高效顯示大量圖示

實作範例:編輯框即時顯示副檔名圖示

void CMyDlg::OnEnChangeEditExt() {
    CString ext; m_editExt.GetWindowText(ext);
    if (ext.IsEmpty()) return;

    CString fname = L"dummy." + ext;
    SHFILEINFO sfi = { 0 };
    SHGetFileInfo(fname, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi),
        SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_LARGEICON);

    if (sfi.hIcon) {
        m_staticIcon.SetIcon(sfi.hIcon); // CStatic 圖示控制項
        // 注意:sfi.hIcon 為系統共享,不可 DestroyIcon
    }
}

優勢總結

  • 無需手動解析註冊表,自動處理所有關聯層級
  • 支援不存在的檔名,適合「預覽」功能
  • 效能極佳,系統內部已快取關聯資訊
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved