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

解决方案 »

  1.   

    调用SHGetFileInfo函数,假设sExt是你的文件名。var
      sfi:TSHFileInfo;
      i:Integer;
    begin
      //获得文件的扩展名
      i:= slIcon.IndexOf(sExt);
      if i>-1 then
        Result:=i
      else
      begin
        {获得与sfLocal相关联的文件信息,返回
        值保存在sfi中,sfi中的hIcon是文件的关联图标局柄}
        SHGetFileInfo(PChar(sExt),FILE_ATTRIBUTE_NORMAL,
                      sfi, Sizeof(sfi),
                      (SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_SMALLICON ));
        {调用ImageList_AddIcon函数将sfi.hIcon添加到图标列表控件ImageList1中}
        i:=ImageList_AddIcon(ImageList1.Handle,sfi.hIcon);
        //函数调用成功返回值i为图标在imagelist1中的索引,将slIcon中与索引相同的
        //string的值设定为sfLocal的扩展名
        if i>-1 then
          slIcon.Strings[i]:=sExt;
        Result:=i;
      end;
    end;
      

  2.   

    你可以参考下这两篇文章:http://www.netgocn.com/UseIcon.htm
    http://hubdog.csdn.net/Recommend/rcFolder.htm
      

  3.   

    我最近做了一个跟你的要求类似的东西, 以下是相关的部分代码.{-----------------------------------------------------------------------------
      Procedure: GetFileIcon
      Purpose:   Get File Icon
      Arguments: const Filename:String; SmallIcon:Boolean
      Result:    HICON
      Author:    Cyclone
      Date:      2005-3-11 13:08:57-----------------------------------------------------------------------------}
    function GetFileIcon(const Filename:String; SmallIcon:Boolean):HICON;
    var
      info: TSHFILEINFO;
      Flag: Integer;
    begin
      if SmallIcon then
        Flag := (SHGFI_SMALLICON or SHGFI_ICON)
      else
        Flag := (SHGFI_LARGEICON or SHGFI_ICON);
      SHGetFileInfo(Pchar(Filename), 0, info, Sizeof(info), Flag);
      Result := info.hIcon;
    end;{-----------------------------------------------------------------------------
      Procedure: TfmMain.GetIconIndex
      Purpose:   Get Icon Index
      Arguments: const FileType: String
      Result:    Integer
      Author:    Cyclone
      Date:      2005-3-3 22:57:05-----------------------------------------------------------------------------}
    function TfmMain.GetIconIndex(const FileType: String): Integer;
    var
      i: Integer;
      TempFileName: String;
    begin
      for i := 0 to Length(IconComparisonTable) - 1 do
      begin
        if UpperCase(IconComparisonTable[i]) = UpperCase(FileType) then
        begin
          Result := i;
          Exit;
        end;
      end;
      TempFileName := ChangeFileExt(GetSystemTempFileName(GetSystemTempPath, 'Cyc', 10), FileType);
      FileClose(FileCreate(TempFileName));
      try
        FileIcon.Handle := GetFileIcon(TempFileName, False);
        imgLargeDocuments.AddIcon(FileIcon);
        FileIcon.Handle := GetFileIcon(TempFileName, True);
        i := imgSmallDocuments.AddIcon(FileIcon);
        SetLength(IconComparisonTable, i + 1);
        IconComparisonTable[i] := UpperCase(FileType);
        Result := i;
      finally
        DeleteFile(TempFileName);
      end;
    end;
      

  4.   

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