使用SHGetFileInfo()获取系统文件夹图标却得到错误图标
问题原因与解决办法
你的问题出在第一个参数传了空字符串_T(""),结合SHGFI_USEFILEATTRIBUTES和FILE_ATTRIBUTE_DIRECTORY,Windows会把空字符串识别为驱动器根目录(比如系统盘C:\),而非普通文件夹,所以返回的自然是驱动器图标,iIcon=80正好对应系统默认的驱动器大图标索引。
修正方案
方案1:传递有效文件夹路径
直接传入一个合法的文件夹路径(比如当前目录_T("."),或者任意存在的文件夹路径),保留原有的参数组合即可获取普通文件夹图标:
SHGetFileInfo( _T("."), FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES);
方案2:获取系统标准文件夹图标(无需真实路径)
如果不想依赖真实存在的文件夹,可以通过SHGetFolderPath获取系统标准文件夹(比如桌面、文档)的路径,再调用SHGetFileInfo:
TCHAR szStandardFolder[MAX_PATH]; // 获取桌面文件夹路径作为示例 SHGetFolderPath(NULL, CSIDL_DESKTOPDIRECTORY, NULL, 0, szStandardFolder); SHGetFileInfo( szStandardFolder, FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES);
方案3:通过系统图标列表获取索引
如果只需要图标索引,结合SHGFI_SYSICONINDEX时,要确保传入的是文件夹标识而非根目录。比如用_T("*")配合FILE_ATTRIBUTE_DIRECTORY:
SHGetFileInfo( _T("*"), FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES); // 此时sfi.iIcon会返回普通文件夹的图标索引,而非驱动器的80
内容的提问来源于stack exchange,提问作者Nick Gris
相关产品推荐
相关产品推荐

