How to get the location and index of an Icon in a “.lnk” shortcut with SHGetFileInfo in C++

北城以北 提交于 2019-12-12 20:09:10

问题


I am using C++ (VS 2012) on Win7x64 and am trying to get the location and index of an icon using SHGetFileInfo with SHGFI_ICONLOCATION like this:

SHFILEINFO info;
memset(&info, 0, sizeof(info));
DWORD_PTR result = SHGetFileInfo(_T("C:\\Users\\Admin\\Desktop\\test.lnk"), 0, &info, sizeof(SHFILEINFO),  SHGFI_ICONLOCATION);

I get a 1 as result and after inspecting info.szDisplayName I see this:

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  ............

What I find strange is that although the string info.szDisplayName appears empty due to the 00 00 at the start, the call to SHGetFileInfo seems to have filled in the entire path correctly and then replaced the drive letter in it with a 00 00 making it an "empty" string.

What I also have noticed is that when I choose a different icon from a different executable it appears to work alright. But when I then create a shortcut to that different executable and use the icon from it that worked before it again returns this "empty" string.

It seems to work sort of crisscross with the locations of the executable and the icon, but with the icon being from the same executable it always seems to exhibit this strange behaviour. The only exception to this is the index of the icon.

It does not matter if an executable has only one or many icons, but when I use an icon with an index greater than 0, it does fill in the location correctly and the index as well, even though the location of the executable and the icon in the shortcut is the same.

Why is SHGetFileInfo filling in icon.szDisplayName as an "empty" string when in the shortcut the location of the icon is the same as the executable and the index is 0?

来源:https://stackoverflow.com/questions/21885231/how-to-get-the-location-and-index-of-an-icon-in-a-lnk-shortcut-with-shgetfile

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!