如何使用C ++中的SHGetFileInfo获取“.lnk”快捷方式中Icon的位置和索引

时间:2014-02-19 15:36:57

标签: c++ windows icons desktop-shortcut

我在Win7x64上使用C ++(VS 2012),并尝试使用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?

0 个答案:

没有答案