C# ExtractAssociatedIcon返回null
我正在使用C# ExtractAssociatedIcon返回null,c#,icons,C#,Icons,我正在使用ExtractAssociatedIcon方法检索文件的图标。我的希望是检索用户在浏览器窗口中看到的相同图标 public static Icon GetIcon(string fileName) { try { Icon icon = Icon.ExtractAssociatedIcon(fileName); return icon; } catch
ExtractAssociatedIcon
方法检索文件的图标。我的希望是检索用户在浏览器窗口中看到的相同图标
public static Icon GetIcon(string fileName)
{
try
{
Icon icon = Icon.ExtractAssociatedIcon(fileName);
return icon;
}
catch
{
return null;
}
}
这种方法99%的时间都有效。但是,如果用户链接到共享路径上的文件,例如\\SOME\u SERVER\my documents\this file.pdf
,则返回null。文件路径不是有效路径,这是一个“捕获”错误
它是一个有效的URI(我已经验证了文件存在、可读性等),但不是一个带有X:\some\文件夹符号的有效的完全限定驱动器路径
如果有的话,我怎样才能摆脱它呢
谢谢
重新更新
这是我最终得到的解决方案。它比第一次更新要干净得多。非常感谢克里斯·哈斯,他的回答是评论,而不是直接的回答。如果/当他作出直接回答时,我将对此进行更新
我仍然需要通过C++库来降低图标,但是我需要的唯一的库如下:
#region Old-School method
[DllImport("shell32.dll")]
static extern IntPtr ExtractAssociatedIcon(IntPtr hInst,
StringBuilder lpIconPath, out ushort lpiIcon);
public static Icon GetIconOldSchool(string fileName)
{
ushort uicon;
StringBuilder strB = new StringBuilder(fileName);
IntPtr handle = ExtractAssociatedIcon(IntPtr.Zero, strB, out uicon);
Icon ico = Icon.FromHandle(handle);
return ico;
}
#endregion
定义了上述方法后,GetIcon()
方法变为:
public static Icon GetIcon(string fileName)
{
try
{
Icon icon = Icon.ExtractAssociatedIcon(fileName);
return icon;
}
catch
{
try
{
Icon icon2 = GetIconOldSchool(fileName);
return icon2;
}
catch
{
return null;
}
}
}
(评论变成后CTIP)
使用以下代码查看最终导致的:
[DllImport("shell32.dll")]
static extern IntPtr ExtractAssociatedIcon(IntPtr hInst, StringBuilder lpIconPath, out ushort lpiIcon);
[DllImport("shell32.dll")]
static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);
_
ExtractAssociatedIcon
的MSDN文档可能重复说明,如果文件路径指示通用命名约定(UNC)路径,将引发ArgumentException
。但这对我如何获得图标没有帮助。=)在这方面有什么建议吗?我第一条评论中的链接会给你一个更简洁的版本,只有两个P/调用,没有枚举或常量。把它作为一个答案,这样我就可以标记它了。。。。你得到了荣誉。这很有效!
ushort uicon;
StringBuilder strB = new StringBuilder(YOUR_FILE_PATH);
IntPtr handle = ExtractAssociatedIcon(this.Handle, strB, out uicon);
Icon ico = Icon.FromHandle(handle);
return ico.ToBitmap();