怎样根据文件的扩展名,找到系统中该类型文件默认的显示图标
如上比如 test.jpg文件,我想得到其在资源管理器中显示的图标.
应该怎样做. 
因为我自己用了一个listview,里面有虚拟的文件列表(文件在硬盘中不存在),想根据文件扩展名在listview中显示出他在本机系统中的默认图标.
高分请教.可以再加分.

解决方案 »

  1.   

    procedure GetSystemImageList(imagelist:TImageList;flag:integer);
    var
        SysIL: THandle;
        SFI: TSHFileInfo;
    begin
      //flag=1 取大图标,2取小图标
      if flag=1 then
        SysIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI),SHGFI_SYSICONINDEX or SHGFI_LARGEICON)
      else
        SysIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI),SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
      if SysIL <> 0 then
      begin
        imagelist.Handle := SysIL;
        imagelist.ShareImages := TRUE;
      end;
    end;
    function GetIconIndex(const AFile: string; Attrs: DWORD): integer;
    var
        SFI: TSHFileInfo;
    begin
        SHGetFileInfo(PChar(AFile), Attrs, SFI, SizeOf(TSHFileInfo),
         SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES);
        Result := SFI.iIcon;
    end;AFile写不存在文件名应该也没问题
      

  2.   

    AFile写不存在文件名应该也没问题
    上边的可以,如果我想得到目录的图标该怎样写呢,我的目录也是不虚拟的,在盘中不存在
    如mydir 是我的目录名,上面可能得到的是无法识别类型的文件图标
    我该怎样得到目录图标(两种,文件夹关闭和打开时的显示图标)
      

  3.   

    谢谢上面的 qiujsh(scsoft.agrie.com) 朋友
    目录也是虚拟的, 上边的输入多了个不字.
    解决后马上结贴.
      

  4.   

    文件默认的打开方式以及文件默认的图标都保存在Windows的注册表中!(Exe,Com等例外)
    图标在注册表的位置:
    HKEY_CLASSES_ROOT\.txt\  的默认键值是txtfile
    所以:
    HKEY_CLASSES_ROOT\txtfile\DefaultIcon\的默认键值是:
    %SystemRoot%\system32\shell32.dll,-152这说明它使用了shell32.dll中的第153个图标
      

  5.   

    qiujsh(scsoft.agrie.com)  的方法是可以的,但是会占用很大的内存。
      

  6.   

    uses shellapi;
    procedure TForm1.Button1Click(Sender: TObject);
    var
       SHFI:TSHFileInfo;
       sTmp: tstrings;
    begin
       sTmp:=tstringlist.create;
       try
          sTmp.SaveToFile(Edit1.text);
          SHGetFileInfo(PChar(edit1.text),0,SHFI,SizeOf(SHFI),SHGFI_ICON or SHGFI_TYPENAME);
          Image1.Picture.Icon.Handle:=SHFI.hIcon;
          DeleteFile(edit1.text);
       finally
          sTmp.free;
       end;
    end;
      

  7.   

    看看D自带的VirtualListView,在Demos里!