类似于资源管理器,用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要释放?
如果不要释放那为什么会出错.
我测试了,文件少问题就没有,问题就出现在取文件图标的代码上面,只要我删除这段代码就没问题了.

解决方案 »

  1.   

    把ShGetFileInfo(Pchar(ExtractFileExt(Mz)),0, SHFileInfo, SizeOf(SHFileInfo),SHGFI_USEFILEATTRIBUTES or SHGFI_ICON);
    改为
    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;
      

  2.   

    用shell方式时注意要引用Shlobj,ActiveX,ShellApi单元(一个或多个)
      

  3.   

    俺的Blog已经讨论过这个问题了