SHGetFileInfo函數詳解

來源:互聯網
上載者:User

SHGetFileInfo函數

WINSHELLAPI DWORD WINAPI SHGetFileInfo(    LPCTSTR pszPath,    DWORD dwFileAttributes,    SHFILEINFO FAR *psfi,    UINT cbFileInfo,    UINT uFlags);

pszPath 參數:指定的檔案名稱。
 當uFlags的取值中不包含 SHGFI_PIDL時,可直接指定;
 當uFlags的取值中包含 SHGFI_PIDL時pszPath要通過計算獲得,不能直接指定;

dwFileAttributes參數:檔案屬性。
 僅當uFlags的取值中包含SHGFI_USEFILEATTRIBUTES時有效,一般不用此參數;

psfi 參數:返回獲得的檔案資訊,是一個記錄類型,有以下欄位:
  _SHFILEINFOA = record
    hIcon: HICON;                      { out: icon }  //檔案的表徵圖控制代碼
    iIcon: Integer;                    { out: icon index }     //表徵圖的系統索引號
    dwAttributes: DWORD;               { out: SFGAO_ flags }    //檔案的屬性值
    szDisplayName: array [0..MAX_PATH-1] of  AnsiChar; { out: display name (or path) }  //檔案的顯示名
    szTypeName: array [0..79] of AnsiChar;             { out: type name }      //檔案的類型名
  end;

cbFileInfo 參數:psfi的位元值;

uFlags 參數:指明需要返回的檔案資訊標識符,常用的有以下常數:
    SHGFI_ICON;           //獲得表徵圖
    SHGFI_DISPLAYNAME;    //獲得顯示名
    SHGFI_TYPENAME;       //獲得類型名
    SHGFI_ATTRIBUTES;     //獲得屬性
    SHGFI_LARGEICON;      //獲得大表徵圖
    SHGFI_SMALLICON;      //獲得小表徵圖
    SHGFI_PIDL;           // pszPath是一個標識符
函數SHGetFileInfo()的傳回值也隨uFlags的取值變化而有所不同。

可見通過調用SHGetFileInfo()可以由psfi參數得到檔案的表徵圖控制代碼。但要注意在uFlags參數中不使用SHGFI_PIDL時,SHGetFileInfo()不能獲得“我的電腦”等虛似檔案夾的資訊。
應該注意的是,在調用SHGetFileInfo()之前,必須使用 CoInitialize 或者OleInitialize 初始化COM,否則表面上能夠使用,但是會造成不安全或者喪失部分功能。例如,一個常見的例子:如果不初始化COM,那麼調用該函數就無法得到.htm/.mht/.xml檔案的表徵圖。
以下是兩個例子:

1.獲得系統表徵圖列表:
//取得系統表徵圖列表
uses
 ShellAPI
var
  ImageListHandle : THandle;
  FileInfo: TSHFileInfo;
//小表徵圖
ImageListHandle := SHGetFileInfo('C:/',
                           0,
                           FileInfo,
                           SizeOf(FileInfo),
                           SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
//把表徵圖列表同一個名叫ListView1的ListView控制項的小表徵圖關聯。                          
SendMessage(ListView1.Handle, LVM_SETIMAGELIST, LVSIL_SMALL, ImageListHandle); 
//大表徵圖   
ImageListHandle := SHGetFileInfo('C:/',
                           0,
                           FileInfo,
                           SizeOf(FileInfo),
                           SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
//把表徵圖列表同一個名叫ListView1的ListView控制項的大表徵圖關聯。                          
SendMessage(ListView1.Handle, LVM_SETIMAGELIST, LVSIL_NORMAL, ImageListHandle);

2.獲得一個檔案的顯示名和表徵圖
var
  sfi: TSHFileInfo;
 IconIndex : Integer;
//取表徵圖的索引號等資訊
SHGetFileInfo(PAnsiChar(FileName),
                0,
                sfi,
                sizeof(TSHFileInfo),
                ShellAPI.SHGFI_DISPLAYNAME or ShellAPI.SHGFI_TYPENAME or ShellAPI.SHGFI_LARGEICON or ShellAPI.SHGFI_ICON);
//顯示名和表徵圖在系統表徵圖列表中的編號就分別在sfi.szDisplayName和sfi.iIcon中 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.