本文從一下幾個方法進行介紹:
- SHGetFileInfo的定義
- SHGetFileInfo()函數的工作原理
- SHGetFileInfo()函數的返回值
- SHGetFileInfo()函數的簡單示例
SHGetFileInfo的定義
SHGetFileInfo在MSDN上的定義是:
Retrieves information about an object in the file system,
- such as a file, folder, directory, or drive root.
它在shellapi.h中定義。這個函數有五個變量,定義如下:
基本上講,SHGetFileInfo()函數提供關於文件系統對象的信息。如前面解釋的,這個對象可以是文件,文件夾,目錄或驅動器根。DWORD的返回是指可能有相當多的返回狀態,這與uFlags變量的設置有關。簡單地說,使用這個函數,你可以期望:
- 確定可執行文件的目標平台(Win32,Win16,MS-DOS)
- 獲取各種有特色的文件圖標(小的,大的,有關聯重疊的,選中的,打開的)
- 讀出其它顯示屬性,如文件類型(顯示在探測器類型列上的簡短描述)和顯示名(出現在名字列上)
- 讀出任何其它屬性,可以是文件特有的,如,是否可以拷貝,移動,刪除或重命名,是否它可以形成一個快捷方式,它是否有子文件夾,是否是共享的,是拖拽目標,或有附加的屬性頁,等等。
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結構定義如下:
HICON hIcon; //文件的圖標句柄
int iIcon; //圖標的系統索引號
DWORD dwAttributes; //文件的屬性值
TCHAR szDisplayName[MAX_PATH]; //文件的顯示名
TCHAR szTypeName[80]; //文件的類型名
} SHFILEINFO;
此外,這個結構總是用於返回數據到調用程序,並且從不需要初始化。唯一可以包含信息來影響函數行為的是dwAttributes成員,在后面將進一步給出解釋。顯然,使用SHGetFileInfo()函數各種行為的所有興趣都集中在對uFlags變量值的設置上。絕大多數情況下,信息經由psfi緩沖返回,但也有些情況,可以有效地包含在函數的DWORD返回之中。SHGetFileInfo()函數的返回值
- If uFlags contains the SHGFI_EXETYPE flag, the return value specifies
- 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,它包含了指定文件或文件夾的圖標。