类似于资源管理器,用SHGetfileinfo遍历所有文件夹 只要遍历的目录下文件很多就会出错下面是我取文件图标的代码
ShGetFileInfo(Pchar(ExtractFileExt(Mz)),0, SHFileInfo, SizeOf(SHFileInfo),SHGFI_USEFILEATTRIBUTES or SHGFI_ICON);
取目录的代码
ShGetFileInfo(nil, faDirectory, SHFileInfo, SizeOf(SHFileInfo),SHGFI_USEFILEATTRIBUTES or SHGFI_ICON);程序创建时就创建了imagelist取系统图标.是不是shgetfileinfo要释放?
如果不要释放那为什么会出错.
我测试了,文件少问题就没有,问题就出现在取文件图标的代码上面,只要我删除这段代码就没问题了.
ShGetFileInfo(Pchar(ExtractFileExt(Mz)),0, SHFileInfo, SizeOf(SHFileInfo),SHGFI_USEFILEATTRIBUTES or SHGFI_ICON);
取目录的代码
ShGetFileInfo(nil, faDirectory, SHFileInfo, SizeOf(SHFileInfo),SHGFI_USEFILEATTRIBUTES or SHGFI_ICON);程序创建时就创建了imagelist取系统图标.是不是shgetfileinfo要释放?
如果不要释放那为什么会出错.
我测试了,文件少问题就没有,问题就出现在取文件图标的代码上面,只要我删除这段代码就没问题了.
改为
ShGetFileInfo(Pchar(Mz),0, SHFileInfo, SizeOf(SHFileInfo),SHGFI_USEFILEATTRIBUTES or SHGFI_ICON);
试试。
或者用shell方式:
function GetShellImage(PIDL: PItemIDList; Large, Open: Boolean): Integer;
var
FileInfo: TSHFileInfo;
Flags: Integer;
begin
FillChar(FileInfo, SizeOf(FileInfo), #0);
Flags := SHGFI_PIDL or SHGFI_SYSICONINDEX or SHGFI_ICON;
if Open then Flags := Flags or SHGFI_OPENICON;
if Large then Flags := Flags or SHGFI_LARGEICON
else Flags := Flags or SHGFI_SMALLICON;
SHGetFileInfo(PChar(PIDL),
0,
FileInfo,
SizeOf(FileInfo),
Flags);
Result := FileInfo.iIcon;
end;