Я использую C ++ (VS 2012) на Win7x64 и пытаюсь получить местоположение и индекс значка, используя SHGetFileInfo
с SHGFI_ICONLOCATION
как это:
SHFILEINFO info;
memset(&info, 0, sizeof(info));
DWORD_PTR result = SHGetFileInfo(_T("C:\\Users\\Admin\\Desktop\\test.lnk"), 0, &info, sizeof(SHFILEINFO), SHGFI_ICONLOCATION);
Я получаю 1 как результат и после проверки info.szDisplayName я вижу это:
0x0022CDE0 00 00 3a 00 5c 00 50 00 72 00 6f 00 ..:.\.P.r.o.
0x0022CDEC 67 00 72 00 61 00 6d 00 20 00 46 00 g.r.a.m. .F.
0x0022CDF8 69 00 6c 00 65 00 73 00 20 00 28 00 i.l.e.s. .(.
0x0022CE04 78 00 38 00 36 00 29 00 5c 00 54 00 x.8.6.).\.T.
0x0022CE10 65 00 73 00 74 00 5c 00 54 00 65 00 e.s.t.\.T.e.
0x0022CE1C 73 00 74 00 2e 00 65 00 78 00 65 00 s.t...e.x.e.
0x0022CE28 00 00 00 00 00 00 00 00 00 00 00 00 ............
0x0022CE34 00 00 00 00 00 00 00 00 00 00 00 00 ............
Что я нахожу странным, это то, что хотя строка info.szDisplayName
отображается пустым из-за 00 00 в начале, вызов SHGetFileInfo
кажется, правильно заполнил весь путь, а затем заменил букву диска на 00 00, сделав его «пустой» строкой.
Я также заметил, что когда я выбираю другой значок из другого исполняемого файла, он, кажется, работает нормально. Но когда я затем создаю ярлык для этого другого исполняемого файла и использую значок из него, который работал до того, как он снова возвращает эту «пустую» строку.
Кажется, что это работает как-то перекрещиваясь с расположением исполняемого файла и значка, но при значке, взятом из одного и того же исполняемого файла, всегда кажется, что это странное поведение. Единственным исключением является индекс значка.
Не имеет значения, имеет ли исполняемый файл только один или несколько значков, но когда я использую значок с индексом больше 0, он правильно заполняет расположение и индекс, даже если местоположение исполняемого файла и значок в ярлыке то же самое.
Почему SHGetFileInfo заполняется icon.szDisplayName
в виде «пустой» строки, когда в ярлыке расположение значка совпадает с исполняемым файлом, а индекс равен 0?
Задача ещё не решена.
Других решений пока нет …