1

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

Load我用 C# 制作了一个可以很好地处理和运行的 dll GetIconLocation。似乎 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 值后提取不会执行...:(

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

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

请有人帮助我....

4

1 回答 1

0

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

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

于 2012-05-31T05:27:13.357 回答