我在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}}对象,它会给我这个界面指针。
另一方面,获取图标句柄是有效的。这个功能只是马车还是我做错了什么?有解决方法吗?
答案 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方法返回。