Windows API——SHGetFileInfo——獲取文件信息

本文從一下幾個方法進行介紹:

 

  •  SHGetFileInfo的定義
  •  SHGetFileInfo()函數的工作原理
  •  SHGetFileInfo()函數的返回值
  •  SHGetFileInfo()函數的簡單示例

 

 SHGetFileInfo的定義

       SHGetFileInfo在MSDN上的定義是:

 Retrieves information about an object in the file system,   

  1. such as a file, folder, directory, or drive root.   

       它在shellapi.h中定義。這個函數有五個變量,定義如下:

DWORD_PTR SHGetFileInfo(
  __in     LPCTSTR pszPath,
  DWORD dwFileAttributes,
  __inout  SHFILEINFO *psfi,
  UINT cbFileInfo,
  UINT uFlags
);

       基本上講,SHGetFileInfo()函數提供關於文件系統對象的信息。如前面解釋的,這個對象可以是文件,文件夾,目錄或驅動器根。DWORD的返回是指可能有相當多的返回狀態,這與uFlags變量的設置有關。簡單地說,使用這個函數,你可以期望:

  1. 確定可執行文件的目標平臺(Win32,Win16,MS-DOS)
  2. 獲取各種有特色的文件圖標(小的,大的,有關聯重疊的,選中的,打開的)
  3. 讀出其它顯示屬性,如文件類型(顯示在探測器類型列上的簡短描述)和顯示名(出現在名字列上)
  4. 讀出任何其它屬性,可以是文件特有的,如,是否可以拷貝,移動,刪除或重命名,是否它可以形成一個快捷方式,它是否有子文件夾,是否是共享的,是拖拽目標,或有附加的屬性頁,等等。
     注:應該注意的是,在調用SHGetFileInfo()之前,必須使用 CoInitialize 或者OleInitialize 初始化COM,否則表面上能夠使用,但是會造成不安全或者喪失部分功能。

SHGetFileInfo()函數的工作原理

       爲了正確地理解函數具有的功能,使用所有可能的方法強制調用這個函數是十分必要的。首先,讓我們查看一下他所要求的變量:

變量名

描述

pszPath

一個包含要取得信息的文件相對或絕對路徑的緩衝。它可以處理長或短文件名。(也就是指定的文件路徑)注[1]

dwFileAttributes

資料上說,這個參數僅用於uFlags中包含SHGFI_USEFILEATTRIBUTES標誌的情況(一般不使用)。如此,它應該是文件屬性的組合:存檔,只讀,目錄,系統等。

Psfi

指向一個接收數據的SHFILEINFO結構的指針。注[2]

cbFileInfo

簡單地給出上項結構的尺寸。

uFlags

函數的核心變量,通過所有可能的標誌,你就能駕馭函數的行爲和實際地得到信息。

 注[1]:當uFlags的取值中不包含 SHGFI_PIDL時,可直接指定;

     當uFlags的取值中包含 SHGFI_PIDL時pszPath要通過計算獲得,不能直接指定;  

 

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

 

  可見通過調用SHGetFileInfo()可以由psfi參數得到文件的圖標句柄。但要注意在uFlags參數中不使用SHGFI_PIDL時,SHGetFileInfo()不能獲得“我的電腦”等虛似文件夾的信息。

 

 注[2]:SHFILEINFO結構定義如下:

typedef struct _SHFILEINFO {  

  HICON hIcon;  //文件的圖標句柄

  int   iIcon;  //圖標的系統索引號

  DWORD dwAttributes;  //文件的屬性值

  TCHAR szDisplayName[MAX_PATH]; //文件的顯示名 

  TCHAR szTypeName[80];  //文件的類型名

} SHFILEINFO;  

        此外,這個結構總是用於返回數據到調用程序,並且從不需要初始化。唯一可以包含信息來影響函數行爲的是dwAttributes成員,在後面將進一步給出解釋。顯然,使用SHGetFileInfo()函數各種行爲的所有興趣都集中在對uFlags變量值的設置上。絕大多數情況下,信息經由psfi緩衝返回,但也有些情況,可以有效地包含在函數的DWORD返回之中。

 SHGetFileInfo()函數的返回值

 

Returns a value whose meaning depends on the uFlags parameter.   
  1. If uFlags contains the SHGFI_EXETYPE flag, the return value specifies  
  2. the type of the executable file. It will be one of the following values:   
Value Executable File Type
0 Nonexecutable file or an error condition
LOWORD = NE or PE and HIWORD = 3.0, 3.5, or 4.0 Windows application
LOWORD = MZ and HIWORD = 0 MS-DOS .exe, .com, or .bat file
LOWORD = PE and HIWORD = 0 Win32 console application

 

       如果函數返回0,則某個地方發生了錯誤。在大多數情況下,是因爲傳遞了不合理的文件名或PIDL,或指定了矛盾的標誌組合。與前兩個相比,後面一個更有可能。 除非指定的標誌告訴它做指定的操作,如果每一個操作都順利完成,這個函數返回1。一個例外是,當SHGFI_EXETYPE標誌設置的時候,

      SHGetFileInfo()返回DWORD值,此時低字表示可執行文件的簽名,下面表中給出解釋:

文件簽名

Hex

意義

PE

0x4550

Win32可執行格式,由微軟所有32位操作系統採用。

NE

0x454E

Windows 3.x新的可執行格式,典型地16位窗口程序

MZ

0x5A4D

DOS 可執行格式,如果查詢.com  bat也返回這個值。

對應的Hex碼實際是文件簽名列的字符碼。例如 0x50 對應 P 0x45 對應 E 等。 高位字的兩個字節包含了運行要求的最小操作系統版本號。

 

        另一個使返回碼包含更多意義的情況是SHGFI_SYSICONINDEX標誌被設置。此時,函數返回一個系統圖像列表Handle,它包含了指定文件或文件夾的圖標。

 SHGetFileInfo()函數的簡單示例

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章