我想通过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将不会执行... :(
这是在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
)
请有人帮助我....
答案 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将图标添加到 它的缓存可以加快后续调用 处理程序。