C# Shell32.dll中SHGetFileInfo

摘要:
可以看出,可以通过调用SHGetFileInfo()从psfi参数获得文件的图标句柄。请注意,uFlags参数中未使用SHGFI。在PIDL期间,SHGetFileInfo()无法获取虚拟文件夹信息,如“我的电脑”。需要注意的是,在调用SHGetFileInfo()之前,COM必须使用CoInitialize或OleInitize进行初始化,否则可以在表面上使用,但这会导致不安全或某些函数丢失。

SHGetFileInfo函数
function SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWORD;
  var psfi: TSHFileInfo; cbFileInfo, uFlags: UINT): DWORD; stdcall;

pszPath 参数:指定的文件名。
当uFlags的取值中不包含 SHGFI_PIDL时,可直接指定;
当uFlags的取值中包含 SHGFI_PIDL时pszPath要通过计算获得,不能直接指定;

dwFileAttributes参数:文件属性。
仅当uFlags的取值中包含SHGFI_USEFILEATTRIBUTES时有效,一般不用此参数;

psfi 参数:返回获得的文件信息,是一个记录类型,有以下字段:
  _SHFILEINFOA = record
    hIcon: HICON;                      { out: icon }  //文件的图标句柄
    iIcon: Integer;                    { out: icon index }     //图标的系统索引号
    dwAttributes: DWORD;               { out: SFGAO_ flags }    //文件的属性值
    szDisplayName: array [0..MAX_PATH-1] of  AnsiChar; { out: display name (or path) }  //文件的显示名
    szTypeName: array [0..79] of AnsiChar;             { out: type name }      //文件的类型名
  end;

cbFileInfo 参数:psfi的比特值;

uFlags 参数:指明需要返回的文件信息标识符,常用的有以下常数:
    SHGFI_ICON;           //获得图标
    SHGFI_DISPLAYNAME;    //获得显示名
    SHGFI_TYPENAME;       //获得类型名
    SHGFI_ATTRIBUTES;     //获得属性
    SHGFI_LARGEICON;      //获得大图标
    SHGFI_SMALLICON;      //获得小图标
    SHGFI_PIDL;           // pszPath是一个标识符
函数SHGetFileInfo()的返回值也随uFlags的取值变化而有所不同。

可见通过调用SHGetFileInfo()可以由psfi参数得到文件的图标句柄。但要注意在uFlags参数中不使用SHGFI_PIDL时,SHGetFileInfo()不能获得“我的电脑”等虚似文件夹的信息。
应该注意的是,在调用SHGetFileInfo()之前,必须使用 CoInitialize 或者OleInitialize 初始化COM,否则表面上能够使用,但是会造成不安全或者丧失部分功能。例如,一个常见的例子:如果不初始化COM,那么调用该函数就无法得到.htm/.mht/.xml文件的图标。
以下是两个例子:

1.获得系统图标列表:
//取得系统图标列表
uses
ShellAPI
var
  ImageListHandle : THandle;
  FileInfo: TSHFileInfo;
//小图标
ImageListHandle := SHGetFileInfo('C:\',
                           0,
                           FileInfo,
                           SizeOf(FileInfo),
                           SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
//把图标列表同一个名叫ListView1的ListView控件的小图标关联。                          
SendMessage(ListView1.Handle, LVM_SETIMAGELIST, LVSIL_SMALL, ImageListHandle); 
//大图标   
ImageListHandle := SHGetFileInfo('C:\',
                           0,
                           FileInfo,
                           SizeOf(FileInfo),
                           SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
//把图标列表同一个名叫ListView1的ListView控件的大图标关联。                          
SendMessage(ListView1.Handle, LVM_SETIMAGELIST, LVSIL_NORMAL, ImageListHandle);

2.获得一个文件的显示名和图标
var
  sfi: TSHFileInfo;
IconIndex : Integer;
//取图标的索引号等信息
SHGetFileInfo(PAnsiChar(FileName),
                0,
                sfi,
                sizeof(TSHFileInfo),
                ShellAPI.SHGFI_DISPLAYNAME or ShellAPI.SHGFI_TYPENAME or ShellAPI.SHGFI_LARGEICON or ShellAPI.SHGFI_ICON);
//显示名和图标在系统图标列表中的编号就分别在sfi.szDisplayName和sfi.iIcon中

免责声明:文章转载自《C# Shell32.dll中SHGetFileInfo》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇读取XML文件iOS程序的启动过程-UIWindow下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

R包的安装 卸载 加载 移除等

R包的安装1)有四个窗口用于使用R studio手动安装R studio,所有安装的R包将显示在右下角窗口中的包下。单击安装-˃输入R包名称-˃单击安装。2) 使用命令安装安装。packagesR包,请卸载删除。packagesR包,加载libraryR包,删除...

jenkins 配置 git拉取代码

#@(!jfkldjMC4r/WaqVy/B+n/SBCY6dsjaNq6ZVhrdNkbh0XMm55fH9ifMyr5UDVHoeUbnwURrH+O7L0uWdhy2w4BHwIqZOF5Bcnd47N9d9hh67jW@!...

Visual Studio Code 之 运行java代码

2、安装成功后,会在右键菜单中多出一个选项:更改vscode“用户设置”文件:添加java.home以及runcode显示在终端coderunner原生的配置有些问题,更改其中终端的命令:加入红色的部分3、点击RunCode,会执行相应的文件...

Windows Server 2008 R2 备份与恢复详细实例

Windows ftp服务可以在百度内置,非常简单。)1.首先安装windows server 2008R2的备份功能。查找Windows的“服务器管理器”。下图显示了我的服务器的情况。双击它。备份完成后,我们卸载qq并删除磁盘F的数据。Linux服务器在没有密码的情况下构建Samba登录,并使用yum进行安装。...

浅析前端常见文件下载的9种场景:Blob基础知识/组成/Blob URL、a标签下载、showSaveFilePicker API下载(兼容性差)、FileSaver.js库下载、Zip下载(JSZip库)、附件形式下载(设置Content-Disposition)、base64格式下载(需转为blob)、分块传输下载、HTTP范围请求下载、大文件分块并行下载

它主要涉及九种文件下载场景。在浏览器端文件下载场景中,JavaScript中的blob类型对象表示一个不可变的原始数据类文件对象。在JavaScript中,您可以通过blob构造函数创建blob对象,blob构造函数表示要放入blob的数组内容的MIME类型。行终止符将更改为适合主机操作系统文件系统的新行字符,允许Blob和file对象用作图像的URL源、下...

如何在Android模拟器上安装apk文件

如本实例的“mishop_2.0.20130911_1.1.1.apk”3.执行控制台命令,进行安装。切换到D盘,输入D:,然后点击Enter,即切换到D盘,输入cd,找到platform-tools的文件地址,即adb.exe的文件路径。,粘贴在控制台中。...