天天看點

桌面外殼API之小技巧一枚

标志位SHGFI_USEFILEATTRIBUTES的用法

對于Windows桌面外殼API SHGetFileInfo來說,你可以向它傳遞一個特殊的标志位SHGFI_USEFILEATTRIBUTES。那麼,這個标志位是什麼意思呢?

Well,它的意思是告訴Windows外殼:請不要通路磁盤,并且假裝我指定的檔案/檔案夾存在,并且檔案/檔案夾的屬性是我傳遞給你的dwFileAttributes參數。請不要管檔案/檔案夾是否真實存在,按我說的做就行了。

這個标志位的一個使用場景是,你可以通過它來擷取某種檔案類型的圖示。舉個例子,為了擷取文本檔案類型的圖示,你可以向SHGetFileInfo傳遞一個檔案名”x.txt”,并在它的uFlags中使用SHGFI_USEFILEATTRIBUTES,同時,指定檔案的屬性為FILE_ATTRIBUTE_NORMAL。

為什麼需要使用檔案名”x.txt”?

因為你需要得到的是一個文本類型檔案的圖示,并且你希望它是一個有效合法的檔案名。

(請不要向它傳遞一個無效的檔案名,例如”???.txt”)

為什麼使用FILE_ATTRIBUTE_NORMAL作為檔案屬性?

因為你希望SHGetFileInfo假裝它是一個普通檔案,如果你傳遞FILE_ATTRIBUTE_DIRECTORY,則你會得到檔案夾的圖示,因為你通過此參數告訴SHGetFileInfo假裝”x.txt”是一個檔案夾,而不是檔案。

請注意,因為這個假裝的動作,某些動态的屬性資訊可能無法擷取。舉個例子,如果某個檔案類型的圖示是根據檔案的内容動态變化的,則這動态變化的圖示不會被傳回,因為,畢竟,你是告訴API要假裝檔案存在,而一個虛構的檔案根本不會存在任何内容。

總結

最後