桌面外壳API之小技巧一枚

桌面外壳API之小技巧一枚

作者:BlogUpdater |  时间:2021-03-24 |  浏览:67 |  评论已关闭 条评论

标志位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要假装文件存在,而一个虚构的文件根本不会存在任何内容。

总结
当里个当,所以咱们设计API的原则就是:缺那啥就补那啥。

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《What does SHGFI_USEFILEATTRIBUTES mean?》

评论已关闭。