在C#中为自定义图标创建一个Windows扩展处理程序

时间:2012-05-30 16:48:54

标签: c# windows

我想通过dll处理文件扩展名图标,并根据Windows资源管理器中的文件内容给出图标(类似于PSD文件的缩略图图标.Photoshop处理.psd扩展名并为每个文件生成缩略图)

我在C#中创建了一个可以很好地处理LoadGetIconLocation函数的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将不会执行... :(

这是在Windows资源管理器中查看两个.myf文件图标后的日志

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..

(有时两次GetIconLocation来电没有Load

请有人帮助我....

1 个答案:

答案 0 :(得分:0)

它可以帮助您回答我的问题:(来自微软网站......)

实施IExtractIcon 接口 界面初始化后, Shell使用处理程序的IExtractIcon 用于请求相应图标的界面。 界面有两种方法: IExtractIcon :: GetIconLocation和 IExtractIcon :: Extract。 图标由其位置标识 文件系统。该 IExtractIcon :: GetIconLocation方法 被叫来请求这些信息。组 文件的szIconFile参数 名称。如果中有多个图标 该文件,将piIndex设置为图标的索引。 为这两者分配适当的值 标志变量。如果你不想 指定文件名,或者如果不指定 希望Shell提取图标,设置 pwFlags中的GIL_NOTFILENAME标志 参数。您不需要分配 值为szIconFile,但是处理程序 必须提供图标句柄 Shell调用IExtractIcon :: Extract。 如果返回文件名,则为Shell 通常会尝试从中加载图标 它的缓存。为了防止加载 缓存图标,设置GIL_DONTCACHE pwFlags参数中的标志。如果一个 未加载缓存图标,然后是Shell 电话 IExtractIcon :: Extract来请求 图标句柄。 如果指定了文件和索引 IExtractIcon :: GetIconLocation,它们 传递给IExtractIcon :: Extract in 该 pszFile和nIconIndex参数, 分别。如果提供了文件名, 你的处理程序可以返回S_FALSE 让Shell解压缩图标。 否则,您的处理程序必须提取或 否则产生大大小小 图标,并分配他们的HICON句柄 phiconLarge和phiconSmall 参数。 Shell将图标添加到 它的缓存可以加快后续调用 处理程序。