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

我在Win7x64上使用C ++(VS 2012),并试图用SHGFI_ICONLOCATION使用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 ..:.\.Pro 0x0022CDEC 67 00 72 00 61 00 6d 00 20 00 46 00 gram .F. 0x0022CDF8 69 00 6c 00 65 00 73 00 20 00 28 00 iles .(. 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 est\.Te 0x0022CE1C 73 00 74 00 2e 00 65 00 78 00 65 00 st..exe 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 ............ 

我觉得奇怪的是,虽然stringinfo.szDisplayName由于00 00在开始时显示为空,但对SHGetFileInfo的调用似乎已经正确地填充了整个path,然后用00 00replace了其中的驱动器号一个“空”string。

我也注意到的是,当我从不同的可执行文件中select不同的图标时,它似乎工作正常。 但是,当我然后创build一个快捷方式到不同的可执行文件,并使用它的工作之前,它再次返回这个“空”string的图标。

它似乎工作与可执行文件和图标的位置交错,但图标来自同一个可执行文件似乎总是performance出这种奇怪的行为。 唯一的例外是图标的索引。

无论是一个可执行文件只有一个还是多个图标,但是当我使用索引大于0的图标时,它都会正确地填充位置以及索引,即使可执行文件的位置和图标在快捷方式是一样的。

为什么SHGetFileInfo在icon.szDisplayName填充图标的位置与可执行文件相同且索引为0时,为“空”string?

Solutions Collecting From Web of "如何用C ++中的SHGetFileInfo在“.lnk”快捷方式中获取图标的位置和索引"