我无法让SHGetFileInfo返回图标位置

时间:2017-03-08 16:07:28

标签: c++ winapi windows-10

我在Windows 10 Pro和Visual Studio 2013上,我正在使用SHGetFileInfoW获取文件类型的图标位置(路径+索引):

std::wstring wFile { L"a.bas" };
SHFILEINFOW fi {};    
DWORD success = ::SHGetFileInfoW(wFile.c_str(), 
                                 FILE_ATTRIBUTE_NORMAL, 
                                 &fi, 
                                 sizeof(fi),
                                 SHGFI_USEFILEATTRIBUTES | SHGFI_ICONLOCATION);

无论wFile是指现有文件还是任何文件名,调用都会返回 1 表示成功。 iIcon fi成员设置为一个数字,但szDisplayString为空。不仅驱动器号被\0覆盖(似乎发生here),但它完全被\0填充。

Microsoft建议使用IExtractIcon :: GetIconLocation作为替代方案,但我需要获取不在本地文件系统上的文件的图标,因此我无法获取{ {1}}对象,它会给我这个界面指针。

另一方面,获取图标句柄是有效的。这个功能只是马车还是我做错了什么?有解决方法吗?

1 个答案:

答案 0 :(得分:3)

图标可以动态生成,也可能不会显示其图像的路径。图标处理程序通过在IExtractIcon::GetIconLocation实现中设置GIL_NOTFILENAME标志将此信息传达给shell。如果设置了GIL_SIMULATEDOC,则shell通常还必须动态生成图标。

如果您使用SHGetFileInfo标志设置SHGFI_SELECTED,那么无论您要求的文件类型是什么,函数都可能必须生成一个新图标。

如果您在ListView / TreeView中显示文件列表,则通常使用SHGFI_SYSICONINDEX|SHGFI_SHELLICONSIZE|SHGFI_SMALLICON并使用系统图像列表。

如果您需要HICON,请使用SHGFI_ICON

如果指定了SHGFI_ICONLOCATION,则SHGetFileInfo使用IExtractIcon:

  

检索包含表示pszPath指定的文件的图标的文件的名称,该文件由文件图标处理程序的IExtractIcon :: GetIconLocation方法返回。