2

我在 Win7x64 上使用 C++ (VS 2012) 并尝试使用SHGetFileInfowith获取图标的位置和索引,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 的图标时,它确实会正确填写位置和索引,即使可执行文件的位置和图标在快捷方式中是相同的。

为什么icon.szDisplayName快捷方式中的图标位置与可执行文件相同且索引为0时,SHGetFileInfo填充为“空”字符串?

4

0 回答 0