我在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?