同上

解决方案 »

  1.   

    ShellAPI的
    SHGetFileInfo_____________________
    http://lysoft.7u7.net
      

  2.   

    uses shellapi;第一步  取得系统的图标列表的句柄,将之赋予一个图像列表控件。
    procedure GetSystemImageList(imagelist:TImageList);
    var
        SysIL: THandle;
        SFI: TSHFileInfo;
    begin
        // 取小图标,如果将SHGFI_SMALLICON替换成
        //SHGFI_LARGEICON则表示取大图标
        SysIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI),
            SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
        if SysIL <> 0 then begin
            //将imagelist的图像列表句柄指向系统图像句柄
            imagelist.Handle := SysIL;
            //防止组件释放时释放图像句柄,很重要
            imagelist.ShareImages := TRUE;
        end;
    end;第二步  取得要处理文件的图标索引
    //取一个文件的图标索引
    function GetIconIndex(const AFile: string; Attrs: DWORD): integer;
    //Attrs可以为表示文件或路径FILE_ATTRIBUTE_NORMAL or FILE_ATTRIBUTE_DIRECTORY
    var
        SFI: TSHFileInfo;       
    begin
        SHGetFileInfo(PChar(AFile), Attrs, SFI, SizeOf(TSHFileInfo),
        SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES);
        Result := SFI.iIcon;
    end;实例调用:
    //如在TreeView中得到c:\mydir的图标,因为是路径所以要加上路径的标志
    aNode.ImageIndex := GetIconIndex('c:\mydir\',
         FILE_ATTRIBUTE_NORMAL or FILE_ATTRIBUTE_DIRECTORY);
    //如在TreeView中得到c:\index.html的图标
    aNode.ImageIndex := GetIconIndex('c:\index.html',FILE_ATTRIBUTE_NORMAL);
      

  3.   

    合成以上两方法:
    function GetSystemIconIndex(ToImagelist:TImageList; const FileName: String; LargeIcon: Boolean = false): Integer;
    var
        SysIL: THandle;
        SFI: TSHFileInfo;
        Attrs: DWORD;
    begin
        Result := -1;
        // 取小图标,如果将SHGFI_SMALLICON替换成
        //SHGFI_LARGEICON则表示取大图标
        if LargeIcon 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的图像列表句柄指向系统图像句柄
            ToImagelist.Handle := SysIL;
            //防止组件释放时释放图像句柄,很重要
            ToImagelist.ShareImages := TRUE;        if ExtractFileExt(FileName) = '' then  //参数为路径。
              begin
                if Not DirectoryExists(FileName) then Exit;
                Attrs := FILE_ATTRIBUTE_NORMAL or FILE_ATTRIBUTE_DIRECTORY;
              end
            else
              begin                                //参数为文件全名。
                if Not FileExists(FileName) then Exit;
                Attrs := FILE_ATTRIBUTE_NORMAL;
              end;
            SHGetFileInfo(PChar(FileName), Attrs, SFI, SizeOf(TSHFileInfo),
            SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES);
            Result := SFI.iIcon;
          end;
    end;