3

一部のファイルのアイコンを変更するIconHandlerがあります。ただし、他のファイルのアイコンは空白になります。他のファイルのデフォルト アイコンを残すには?

 HRESULT CSimpleShlExt::GetIconLocation(UINT uFlags,
  PTSTR pszIconFile,
  UINT cchMax,
  int *piIndex,
  UINT *pwFlags)
 { 
    if (condition)){
        // works well
        lstrcpyn(pszIconFile, L"C:\\Windows\\System32\\shell32.dll", cchMax);
        *piIndex = 5;
        *pwFlags = 0;
    } else {
        // blank icon :(
        *pwFlags = GIL_PERINSTANCE | GIL_NOTFILENAME;// | GIL_DONTCACHE ;
    }
    return S_OK;
 }

これが私の.rgsファイルです:

HKCR  
{
    NoRemove CLSID
{
    ForceRemove {B70B7A24-5180-4092-B3BA-6266F914C053} = s 'My Shell Extension'
    {
        InprocServer32 = s '%MODULE%'
        {
            val ThreadingModel = s 'Apartment'
        }
        TypeLib = s '{62C6D1EB-C172-4E05-BFD2-5F9313832CC3}'
        Version = s '1.0'
    }
}
    NoRemove txtfile
    {
        NoRemove ShellEx
        {
            ForceRemove IconHandler = s '{B70B7A24-5180-4092-B3BA-6266F914C053}'
        }
    }
}
4

2 に答える 2

1

このコードは機能します:

 HRESULT CSimpleShlExt::GetIconLocation(UINT uFlags,
 PTSTR pszIconFile,
 UINT cchMax,
 int *piIndex,
 UINT *pwFlags)
 { 

    if (condition))
    {
        lstrcpyn(pszIconFile, L"C:\\Windows\\System32\\Test.dll", cchMax);

        *piIndex = 0;
    } 
    else 
    {
        *piIndex = 1;

    }

    *pwFlags = 0;
    return S_OK;

 }

HRESULT CSimpleShlExt::Extract(
LPCTSTR pszFile,
UINT nIconIndex,
HICON *phiconLarge,
HICON *phiconSmall,
UINT nIconSize)
{
    return S_FALSE;
}

変更された .rgs ファイル:

HKCR  
{
    NoRemove CLSID
{
    ForceRemove {B70B7A24-5180-4092-B3BA-6266F914C053} = s 'My Shell Extension'
    {
        InprocServer32 = s '%MODULE%'
        {
            val ThreadingModel = s 'Apartment'
        }
        TypeLib = s '{62C6D1EB-C172-4E05-BFD2-5F9313832CC3}'
        Version = s '1.0'
    }
}
    NoRemove txtfile
    {
        NoRemove DefaultIcon = s '%%1'
        NoRemove ShellEx
        {
            ForceRemove IconHandler = s '{B70B7A24-5180-4092-B3BA-6266F914C053}'
        }
    }
}

「MSDN」から-アイコンハンドラーの作成方法

アイコンハンドラの登録

ファイルの種類のアイコンを静的に登録するときは、ファイルの種類の ProgID の下に DefaultIcon サブキーを作成します。そのデフォルト値は、アイコンを含むファイルに設定されています。アイコン ハンドラーを登録するには、引き続き DefaultIcon サブキーが必要ですが、その既定値を "%1" に設定する必要があります。

于 2013-03-28T14:58:05.747 に答える
0

にダミー名を渡すことでこれを行うことができますSHGetFileInfo。例えば、

 HRESULT CSimpleShlExt::GetIconLocation(UINT uFlags,
  PTSTR pszIconFile,
  UINT cchMax,
  int *piIndex,
  UINT *pwFlags)
 { 
    if (condition){
        // works well
        lstrcpyn(pszIconFile, L"C:\\Windows\\System32\\shell32.dll", cchMax);
        *piIndex = 5;
        *pwFlags = 0;
    } else {
        SHFILEINFO sfi;
        SHGetFileInfo(L"dummy", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi),
            SHGFI_ICONLOCATION | SHGFI_USEFILEATTRIBUTES);
        StringCchCopy(pszIconFile, cchMax, sfi.szDisplayName);
        *piIndex = sfi.iIcon;
        *pwFlags = 0;
    }
    return S_OK;
 }

重要なのは、フラグを渡すSHGFI_USEFILEATTRIBUTESことです。つまり、提供するファイル名が実際のファイルを参照する必要はありません。(上記の例のように) ファイル拡張子を付けずにファイル名を指定すると、システムのデフォルトのファイル アイコンが返されます。最後に、SHGFI_ICONLOCATIONフラグはアイコンのパスとインデックスをSHFILEINFO構造体のフィールドに返します。

于 2013-04-02T04:36:38.233 に答える