我在 Win7x64 上使用 C++ (VS 2012) 并尝试使用SHGetFileInfo
with获取图标的位置和索引,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填充为“空”字符串?