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();