【发布时间】:2014-08-17 19:52:54
【问题描述】:
我想获取 shell 命名空间中对象的系统图像列表中的索引。
如果这个对象是一个文件,我可以使用SHGetFileInfo:
function GetFileImageIndex(const Filename: string): Integer;
var
sfi: TSHFileInfo;
begin
SHGetFileInfo(PChar(Filename), FILE_ATTRIBUTE_NORMAL, sfi, SizeOf(sfi),
SHGFI_USEFILEATTRIBUTES or SHGFI_SYSICONINDEX);
Result := sfi.iIcon;
end;
除非我没有文件
我所拥有的东西在硬盘上不作为文件夹或文件存在,例如:
Control PanelHomegroupNetwork
但是我仍然需要在系统图像列表中获取与这个东西对应的图标的索引。我从SHGetFileInfo 开始(因为它支持pidls)。但这分崩离析了。然后我尝试使用IExtractIcon,但结果崩溃了:
function GetObjectImageIndex(ParentFolder: IShellFolder; const ChildPidl: PItemIDList): Integer;
//var
// sfi: TSHFileInfo;
// extractIcon: IExtractIcon;
// iconFile: WideString;
// iconIndexInFile: Integer;
// flags: Cardinal;
begin
{
This function is the shell namespace equivalent of GetFileImageIndex helper function.
}
(*
Won't work (MSDN: "The PIDL must be a fully qualified PIDL. Relative PIDLs are not allowed.")
SHGetFileInfo(PWideChar(ChildPidl), FILE_ATTRIBUTE_NORMAL,
sfi, SizeOf(sfi),
SHGFI_PIDL or SHGFI_SYSICONINDEX);
*)
(*
Won't work. Doesn't return an index into the system imagelist
ParentFolder.GetUIObjectOf(0, 1, ChildPidl, IExtractIcon, nil, {out}extractIcon);
SetLength(iconFile, MAX_PATH);
extractIcon.GetIconLocation(0, PWideChar(iconFile), Length(iconFile), iconIndexInFile, {out}flags);
*)
Result := -1; //TODO: Figure out how to do it.
end;
给定该文件夹中的IShellFolder 和pidl,我如何在该东西的系统图像列表中获取图标?
【问题讨论】: