ExtractAssociatedIcon返回null

时间:2011-07-25 16:40:24

标签: c# icons

我正在使用ExtractAssociatedIcon方法检索文件的图标。我希望检索用户在资源管理器窗口中看到的相同图标。

    public static Icon GetIcon(string fileName) 
    {
        try
        {
            Icon icon = Icon.ExtractAssociatedIcon(fileName);
            return icon;
        }
        catch
        {
            return null;
        }
    }

99%的时间都有效。但是,如果用户已链接到共享路径上的文件,例如\\SOME_SERVER\my documents\this file.pdf,则返回null。它通过“catch”落入文件路径不是有效路径的错误。

这是一个有效的URI(我已验证该文件存在,是否可读等),但不是具有X:\ some \文件夹符号的有效完全限定的驱动器路径。

如果有的话,我该如何解决这个问题呢?

感谢。

重新更新

这是我最终解决的问题。它比第一次更新更清洁。非常感谢Chris Haas,他的回答是评论,而不是直接回答。如果/当他直接回答时,我会这样更新。

我仍然需要下到较低级别并通过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;
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

(评论转变为后CTIP)

使用以下代码查看最终通向link hereP/Invoke.net

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

_

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