ExtractAssociatedIcon возвращает ноль - PullRequest
3 голосов
/ 25 июля 2011

Я использую метод 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, он возвращает ноль.Он проходит через «catch» с ошибкой, что путь к файлу не является допустимым путем.

Это действительный URI (я проверял, что файл существует, доступен для чтения и т. Д.), Но недопустимый полный путь к диску с обозначением X: \ some \ folder.

Как можно обойти это, если вообще?

Спасибо.

ОБНОВЛЕНИЕ

Вот решение, которое я выбрал.Это намного чище, чем первое обновление.Большое спасибо Крису Хаасу, чьим ответом был комментарий, а не прямой ответ.Если / когда он даст прямой ответ, я обновлю это так.

Мне все равно пришлось спуститься на более низкий уровень и извлечь значок через библиотеки 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 Ответ

2 голосов
/ 25 июля 2011

(комментарий превратился в пост - CTIP)

Проверьте ссылку здесь , которая в итоге приводит к P / 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...