SPDL -- SHGetFileInfo

本文从一下几个方法进行介绍:

  • SHGetFileInfo的定义
  •  SHGetFileInfo()函数的工作原理
  •  SHGetFileInfo()函数的返回值
  •  SHGetFileInfo()函数的简单示例

SHGetFileInfo的定义

SHGetFileInfo在MSDN上的定义是:

Retrieves information about an object in the file system,

  1. such as a file, folder, directory, or drive root.

它在shellapi.h中定义。这个函数有五个变量,定义如下:

DWORD_PTR SHGetFileInfo(

__in     LPCTSTR pszPath,

DWORD dwFileAttributes,

__inout  SHFILEINFO *psfi,

UINT cbFileInfo,

UINT uFlags

);

基本上讲,SHGetFileInfo()函数提供关于文件系统对象的信息。如前面解释的,这个对象可以是文件,文件夹,目录或驱动器根。DWORD的返回是指可能有相当多的返回状态,这与uFlags变量的设置有关。简单地说,使用这个函数,你可以期望:

  1. 确定可执行文件的目标平台(Win32,Win16,MS-DOS)
  2. 获取各种有特色的文件图标(小的,大的,有关联重叠的,选中的,打开的)
  3. 读出其它显示属性,如文件类型(显示在探测器类型列上的简短描述)和显示名(出现在名字列上)
  4. 读出任何其它属性,可以是文件特有的,如,是否可以拷贝,移动,删除或重命名,是否它可以形成一个快捷方式,它是否有子文件夹,是否是共享的,是拖拽目标,或有附加的属性页,等等。

注:应该注意的是,在调用SHGetFileInfo()之前,必须使用 CoInitialize 或者OleInitialize 初始化COM,否则表面上能够使用,但是会造成不安全或者丧失部分功能。

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结构定义如下:

typedef struct _SHFILEINFO {

  HICON hIcon;  //文件的图标句柄

  int   iIcon;  //图标的系统索引号

  DWORD dwAttributes;  //文件的属性值

  TCHAR szDisplayName[MAX_PATH]; //文件的显示名

  TCHAR szTypeName[80];  //文件的类型名

} SHFILEINFO;

此外,这个结构总是用于返回数据到调用程序,并且从不需要初始化。唯一可以包含信息来影响函数行为的是dwAttributes成员,在后面将进一步给出解释。显然,使用SHGetFileInfo()函数各种行为的所有兴趣都集中在对uFlags变量值的设置上。绝大多数情况下,信息经由psfi缓冲返回,但也有些情况,可以有效地包含在函数的DWORD返回之中。

SHGetFileInfo()函数的返回值

Returns a value whose meaning depends on the uFlags parameter.

  1. If uFlags contains the SHGFI_EXETYPE flag, the return value specifies
  2. 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,它包含了指定文件或文件夹的图标。



版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-18 19:58:20

SPDL -- SHGetFileInfo的相关文章

SPDL: SHGetSpecialFolderLocation()、SHGetFileInfo()、SHGetPathFromIDList()函数

#include "shlobj.h" //包含头文件 函数介绍 1.WINSHELLAPI HRESULT WINAPI SHGetSpecialFolderLocation (HWND hwndOwner, int nFolder,LPITEMIDLIST * ppidl); //函数声明 hwndOwner: 指定了"所有者窗口",在调用这个函数是可能出現的对话框或信息框. nFolder: 是一个整数id,決定哪个目录是待查找目录,它的取值可能是 CSIDL

用SHGetFileInfo获取文件类型/图标信息

SHFILEINFO fileInfo; SHGetFileInfo( "C:\\boot.ini", NULL, &fileInfo, sizeof(SHFILEINFO), SHGFI_ICON|SHGFI_TYPENAME); cout<<fileInfo.szTypeName<<"文件"<<endl; cout<<"0x"<<hex<<fileInfo.hIc

SHGetFileInfo函数详解

SHGetFileInfo函数: WINSHELLAPI DWORD WINAPI SHGetFileInfo( LPCTSTR pszPath, DWORD dwFileAttributes, SHFILEINFO FAR *psfi, UINT cbFileInfo, UINT uFlags ); pszPath 参数:指定的文件名. 当uFlags的取值中不包含 SHGFI_PIDL时,可直接指定; 当uFlags的取值中包含 SHGFI_PIDL时pszPath要通过计算获得,不能直接指

SPDL: SHGetSpecialFolderLocation 获得系统目录的位置

关于得到 pidl (即:PathIDList) 的函数有: SHGetSpecialFolderLocation():    获得系统目录的位置 SHGetPathFromIDList ():              将 pidl 转化为文件夹路径 SHBrowseForFolder():                  显示浏览文件夹对话框 SHBrowseForFolder()                   是一个可以用于获取文件夹路径的Windows API SHGetDesk

Scyther spdl

1.协议的主要的核心是定义一个协议在协议中声明角色: Protocol  ExampleProtocol(I,R){ role I{   }; role R{   }://在角色中一开始我们没有定义角色的行为 }     ////在协议中声明两个角色,分别是 I 和   R 很多安全协议依赖生成一个随机的值,他们可以在一个角色中使用 fresh 声明一个临时的值,列如下面 在角色X中 使用 fresh 声明一个Nonce 类型的临时值 : role X(.....){ fresh Na:Nonc

MFC 任务管理器设计

在学习界面设计,因为对一些控件不熟悉,所以也参考了别人的.核心代码如下. void CTasklistDlg::Expand() { m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); m_list.InsertColumn(0,L"Process Name",0,100); m_list.InsertColumn(1,L"Pid",0,100); m_list.InsertColumn

Delphi中根据分类数据生成树形结构的最优方法

一. 引言:    TreeView控件适合于表示具有多层次关系的数据.它以简洁的界面,表现形式清晰.形象,操作简单而深受用户喜爱.而且用它可以实现ListView.ListBox所无法实现的很多功能,因而受到广大程序员的青睐.    树形结构在Windows环境中被普遍应用,但在数据库开发中面对层次多.结构复杂的数据,如何快速构造树形目录并实现导航呢?    二. 实现关键技术:    在Delphi提供的控件中包含了TreeView控件,但树的具体形成还需要用户编写代码.即它的列表项要在程序

SOUI界面库 添加 windows系统文件图标皮肤

最近在学习soui界面库.其中有用到SListCtrl这个控件来现在文件信息.控件用法基本上和mfc 的CListCtrl差不多.也支持图标显示.但是图标是要自己加入图标图片的.这个就有点不好弄.于是我就自己实现了 windows系统文件图标 的skin 皮肤.不多说了 ,直接上代码. 1 #ifndef __WINFILE_ICON_SKIN_HPP_ 2 #define __WINFILE_ICON_SKIN_HPP_ 3 4 #include "core/SSkinObjBase.h&qu

NetAnalyzer笔记 之 六 用C#打造自己的网络连接进程查看器(为进程抓包做准备)

[创建时间:2016-04-13 22:37:00] NetAnalyzer下载地址 起因 最近因为NetAnalyzer2016的发布,好多人都提出是否可以在NetAnalyzer中加入一个基于进程的抓包功能.所以最近研究了一下大概有这样一个想法: 获取系统打开端口的所有进程,并获取进程所开启的端口.IP地址以及使用的协议等信息,然后生成对应的过滤表达式,然后给NetAnalyzer设置该过滤表达式,然后开始抓包. 开始 虽然.Net中提供了进程信息查看的相关库,但是却没有提供相关网络端口查询