1

ファイル拡張子のアイコンをdllで扱い、Windowsエクスプローラーでファイルの内容に合わせてアイコンを付けたい(PSDファイルのサムネイルアイコンのようなもの。Photoshopは.psd拡張子を扱い、ファイルごとにサムネイルを生成する)

私はC#でうまく処理LoadしてGetIconLocation機能するdllを作成しました。WindowsはExtract後で関数を呼び出す必要があるようGetIconLocationですが、そうではありません!

インターフェース:

   [ComVisible(true), ComImport, Guid("000214eb-0000-0000-c000-000000000046"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
   public interface IExtractIcon
   {
        [PreserveSig]
        uint GetIconLocation(int uFlags, IntPtr szIconFile, int cchMax, IntPtr piIndex, UIntPtr pwFlags);

        //[PreserveSig]
        //uint GetIconLocation(uint uFlags, IntPtr szIconFile, uint cchMax, IntPtr piIndex, UIntPtr pwFlags);
        [PreserveSig]
        uint Extract(string pszFile, uint nIconIndex, ref IntPtr phiconLarge,ref IntPtr phiconSmall, uint nIconSize);
    }

そして機能:

    public uint Load(string pszFileName, uint dwMode)//Using IPersistFile
    {
        icon_File = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Icon.bmp");
        tip = "My tool-tip";
        Logger.WriteLog("Load :"+pszFileName+" , "+dwMode.ToString());

        return S_OK;

    }

    public uint GetIconLocation(int uFlags, IntPtr szIconFile, int cchMax, IntPtr piIndex, UIntPtr pwFlags)//Using IExtractIcon and IPersistFile.Load
    {
            try
            {
                IconHandlerReturnFlags Flags;

                Flags = IconHandlerReturnFlags.PerClass | IconHandlerReturnFlags.DontCache | IconHandlerReturnFlags.NotFilename;
                pwFlags = (UIntPtr)Flags;

                Logger.WriteLog("GetIconLocation...");
                return S_OK;
            }
            catch (Exception e)
            {
                Logger.WriteLog("GetIconLocation " + e.Message);
                return S_FALSE;
            }
        }


        public uint Extract(string pszFile, uint nIconIndex, ref IntPtr phiconLarge,ref IntPtr phiconSmall, uint nIconSize)//Using IExtractIcon 
        {

                Logger.WriteLog("Extract...");
    // other code...
}

Load関数は正しく機能し、正しいファイル名を提供します。また、GetIconLocation動作します。しかし、S_OK 値が返された後、Extract は実行されません...:(

.myfこれは、 Windows エクスプローラーで 2 つのファイル アイコンを表示した後のログです。

Load : C:\**********1.Myf , 0
GetIconLocation...
Load : C:\**********2.Myf , 0
GetIconLocation...
Load : C:\**********1.Myf , 0
GetIconLocation...
GetIconLocation...
Load : C:\**********1.Myf , 0
GetIconLocation..

(時々 2GetIconLocationなしで呼び出しますLoad)

誰か助けてください……。

4

1 に答える 1

0

それはあなたが私の質問に答えるのを助けるかもしれません:(マイクロソフトサイトから...)

IExtractIconインターフェイスの実装インターフェイスが初期化された後、シェルはハンドラーのIExtractIconインターフェイスを使用して適切なアイコンを要求します。インターフェイスには、IExtractIcon::GetIconLocationとIExtractIcon::Extractの2つのメソッドがあります。アイコンは、ファイルシステム内の場所によって識別されます。IExtractIcon :: GetIconLocationメソッドは、この情報を要求するために呼び出されます。szIconFileパラメーターをファイル名に設定します。ファイルに複数のアイコンがある場合は、piIndexをアイコンのインデックスに設定します。2つのフラグ変数に適切な値を割り当てます。ファイル名を指定したくない場合、またはシェルにアイコンを抽出させたくない場合は、pwFlagsパラメーターでGIL_NOTFILENAMEフラグを設定します。szIconFileに値を割り当てる必要はありませんが、シェルがIExtractIcon :: Extractを呼び出すときに、ハンドラーはアイコンハンドルを提供する必要があります。ファイル名を返すと、シェルは通常、キャッシュからアイコンを読み込もうとします。キャッシュされたアイコンが読み込まれないようにするには、pwFlagsパラメーターでGIL_DONTCACHEフラグを設定します。キャッシュされたアイコンがロードされていない場合、シェルはIExtractIcon::Extractを呼び出してアイコンハンドルを要求します。ファイルとインデックスがIExtractIcon::GetIconLocationによって指定された場合、それらはそれぞれpszFileパラメーターとnIconIndexパラメーターでIExtractIcon::Extractに渡されます。ファイル名が指定されている場合、ハンドラーはS_FALSEを返して、シェルにアイコンを抽出させることができます。それ以外の場合、ハンドラーは大きいアイコンと小さいアイコンを抽出または生成し、それらのHICONハンドルをphiconLargeパラメーターとphiconSmallパラメーターに割り当てる必要があります。シェルはアイコンをキャッシュに追加して、ハンドラーへの後続の呼び出しを促進します。シェルは通常、キャッシュからアイコンを読み込もうとします。キャッシュされたアイコンが読み込まれないようにするには、pwFlagsパラメーターでGIL_DONTCACHEフラグを設定します。キャッシュされたアイコンがロードされていない場合、シェルはIExtractIcon::Extractを呼び出してアイコンハンドルを要求します。ファイルとインデックスがIExtractIcon::GetIconLocationによって指定された場合、それらはそれぞれpszFileパラメーターとnIconIndexパラメーターでIExtractIcon::Extractに渡されます。ファイル名が指定されている場合、ハンドラーはS_FALSEを返して、シェルにアイコンを抽出させることができます。それ以外の場合、ハンドラーは大きいアイコンと小さいアイコンを抽出または生成し、それらのHICONハンドルをphiconLargeパラメーターとphiconSmallパラメーターに割り当てる必要があります。シェルはアイコンをキャッシュに追加して、ハンドラーへの後続の呼び出しを促進します。シェルは通常、キャッシュからアイコンを読み込もうとします。キャッシュされたアイコンが読み込まれないようにするには、pwFlagsパラメーターでGIL_DONTCACHEフラグを設定します。キャッシュされたアイコンがロードされていない場合、シェルはIExtractIcon::Extractを呼び出してアイコンハンドルを要求します。ファイルとインデックスがIExtractIcon::GetIconLocationによって指定された場合、それらはそれぞれpszFileパラメーターとnIconIndexパラメーターでIExtractIcon::Extractに渡されます。ファイル名が指定されている場合、ハンドラーはS_FALSEを返して、シェルにアイコンを抽出させることができます。それ以外の場合、ハンドラーは大きいアイコンと小さいアイコンを抽出または生成し、それらのHICONハンドルをphiconLargeパラメーターとphiconSmallパラメーターに割り当てる必要があります。シェルはアイコンをキャッシュに追加して、ハンドラーへの後続の呼び出しを促進します。pwFlagsパラメーターにGIL_DONTCACHEフラグを設定します。キャッシュされたアイコンがロードされていない場合、シェルはIExtractIcon::Extractを呼び出してアイコンハンドルを要求します。ファイルとインデックスがIExtractIcon::GetIconLocationによって指定された場合、それらはそれぞれpszFileパラメーターとnIconIndexパラメーターでIExtractIcon::Extractに渡されます。ファイル名が指定されている場合、ハンドラーはS_FALSEを返して、シェルにアイコンを抽出させることができます。それ以外の場合、ハンドラーは大きいアイコンと小さいアイコンを抽出または生成し、それらのHICONハンドルをphiconLargeパラメーターとphiconSmallパラメーターに割り当てる必要があります。シェルはアイコンをキャッシュに追加して、ハンドラーへの後続の呼び出しを促進します。pwFlagsパラメーターにGIL_DONTCACHEフラグを設定します。キャッシュされたアイコンがロードされていない場合、シェルはIExtractIcon::Extractを呼び出してアイコンハンドルを要求します。ファイルとインデックスがIExtractIcon::GetIconLocationによって指定された場合、それらはそれぞれpszFileパラメーターとnIconIndexパラメーターでIExtractIcon::Extractに渡されます。ファイル名が指定されている場合、ハンドラーはS_FALSEを返して、シェルにアイコンを抽出させることができます。それ以外の場合、ハンドラーは大きいアイコンと小さいアイコンを抽出または生成し、それらのHICONハンドルをphiconLargeパラメーターとphiconSmallパラメーターに割り当てる必要があります。シェルはアイコンをキャッシュに追加して、ハンドラーへの後続の呼び出しを促進します。これらは、pszFileパラメーターとnIconIndexパラメーターでそれぞれIExtractIcon::Extractに渡されます。ファイル名が指定されている場合、ハンドラーはS_FALSEを返して、シェルにアイコンを抽出させることができます。それ以外の場合、ハンドラーは大きいアイコンと小さいアイコンを抽出または生成し、それらのHICONハンドルをphiconLargeパラメーターとphiconSmallパラメーターに割り当てる必要があります。シェルはアイコンをキャッシュに追加して、ハンドラーへの後続の呼び出しを促進します。これらは、pszFileパラメーターとnIconIndexパラメーターでそれぞれIExtractIcon::Extractに渡されます。ファイル名が指定されている場合、ハンドラーはS_FALSEを返して、シェルにアイコンを抽出させることができます。それ以外の場合、ハンドラーは大きいアイコンと小さいアイコンを抽出または生成し、それらのHICONハンドルをphiconLargeパラメーターとphiconSmallパラメーターに割り当てる必要があります。シェルはアイコンをキャッシュに追加して、ハンドラーへの後続の呼び出しを促進します。

于 2012-05-31T05:27:13.357 に答える