现在的位置: 首页 > 综合 > 正文

Windows Shell 编程 第四章

2013年05月18日 ⁄ 综合 ⁄ 共 2903字 ⁄ 字号 评论关闭
以前,所有文件和目录都有一个确定的属性集:时间,日期,尺寸,以及表示‘只读的’,‘隐藏的,‘存档的’,或‘系统的’状态标志。然而,Windos95(及后来的WindowsNT4.0)出现使这些概念产生了改变,其中最重要的‘文件’变得更加广泛。现在,文件可以是任何Shell部件对象—不一定必须是文件系统的部件。

         文件的精确定义是,任何作为Shell命名空间部件的对象称之为文件对象。注意,在定义中所说的‘命名空间’,它不是C++的关键字。‘Shell 命名空间’所指的是实际组成Shell的所有命名项的集合。它们都被显示在探测器的树观察中。

         并不是所有文件都是文件系统中的一个实体,比如‘打印机’和‘我的计算机’。一个包含子文件对象的文件对象成为文件夹对象,文件和目录是最普通的文件对象。

         所有这些变化作为微软完全面向对象的操作系统实现的第一步,已经融入到Windows9xWindowsNT中。

         一个文件对象可以有多少属性呢?回答是,它是一个集合,它完全包含MS-DOS下一个文件的所有属性以及几个由Windows95 Windows NT外壳的图形本质要求的属性。Shell API提供了一个复合函数和相当丰富的功能来探索给定文件对象的特征,它可以是一个普通文件,一个目录,甚或一个系统文件夹,一个象打印机或拨号连接那样的系统对象。这个函数就是SHGetFileInfo()

         在这一章中,主要目标是研究这个函数的原形。对于特定的文件对象,重点是:

                   怎样获取类型名

                   怎样获取探测器图标的Handle

                   怎样获取可执行文件的目标平台

                   怎样读出属性,以确定在探测器下对文件对象有哪些事情是可以做的,哪些事情是不能做的。

SHGetFileInfo()函数所获得信息的多样性,你会感到奇怪。曾记得,有一个读者询问我,怎样确定一个给定的.EXE文件是16位的还是32位的(不用映射EXE的头结构)。我的答案是SHGetFileInfo()。几天以后,他回来再次问我,怎样获取驱动器的图标,我再次告诉他,使用SHGetFileInfo()。这最终的结果告诉我们仔细研究SHGetFileInfo()函数是理解Shell文件对象的最好方法。

 

SHGetFileInfo()函数的功能

         同以往一样,我们从函数的原形开始,它在shellapi.h中定义。这个函数有五个变量,定义如下:

DWORD SHGetFileInfo(    LPCTSTR pszPath,

DWORD dwFileAttributes,

SHFILEINFO FAR* psfi,

UINT cbFileInfo,

UINT uFlags);

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

    确定可执行文件的目标平台(Win32Win16MS-DOS)

    获取各种有特色的文件图标(小的,大的,有关联重叠的,选中的,打开的)

    读出其它显示属性,如文件类型(显示在探测器类型列上的简短描述)和显示名(出现在名字列上)

读出任何其它属性,可以是文件特有的,如,是否可以拷贝,移动,删除或重命名,是否它可以形成一个快捷方式,它是否有子文件夹,是否是共享的,是拖拽目标,或有附加的属性页,等等。

 

SHGetFileInfo()函数的工作原理

       为了正确地理解函数具有的功能,使用所有可能的方法强制调用这个函数是十分必要的。首先,让我们查看一下他所要求的变量:

变量名

描述

pszPath

一个包含要取得信息的文件相对或绝对路径的缓冲。它可以处理长或短文件名。

dwFileAttributes

资料上说,这个参数仅用于uFlags中包含SHGFI_USEFILEATTRIBUTES标志的情况。如此,它应该是文件属性的组合:存档,只读,目录,系统等。

Psfi

指向一个接收数据的SHFILEINFO结构的指针。

cbFileInfo

简单地给出上项结构的尺寸。

uFlags

函数的核心变量,通过所有可能的标志,你就能驾驭函数的行为和实际地得到信息。

 

SHFILEINFO结构定义如下:

typedef struct _SHFILEINFO

{

HICON hIcon;

int iIcon;

DWORD dwAttributes;

char szDisplayName[MAX_PATH];

char szTypeName[80];

} SHFILEINFO;

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

 

指定输入文件

         恢复文件信息的函数首先要求操作文件的名字,pszPath参数就是用于这个目的。然而,有一些观念是需要澄清的。其中之一是,它可以是路径名(正象所期望的),或是一个PIDL,这在第二章中讨论过了。

         如果想要传递一个PIDL,而不是普通的路径名,你就应该设置SHGFI_PIDL标志到uFlags变量中。反之也是如此:如果设置了SHGFI_PIDL,则pszPath就必须指向一个ITEMIDLIST结构(即一个PIDL)。当然,pszPath也可以是文件夹名或驱动器名,此时,你需要把一个 /’留在路径名的最后。即,你应该指定‘c:/’而不是‘c:’以避免错误地恢复了驱动器信息。

 

SHGetFileInfo()中使用通配符

         资料中并没有给出关于在SHGetFileInfo()函数中使用通配符的的任何解释,因此,你可能认为通配符不能识别。然而,我发现,如果传递一个带有通配符的串,然后提供至少一个文件匹配这个模式,函数照样正确工作。下图显示了一个简单程序的输出结果,这个程序将在后面详细讨论:

                


这个程序让我们选择一个文件名或路径名,然后恢复它的信息。它返回一个图标,显示名,类型名和所有其它属性的列表。另,你也可以询问程序以确定可执行文件的类型。Exe文件类型复选框抑制所有其它的选择。‘返回码’标签显示函数的返回码(或它的文字描述),通过选中‘接受任何文件名’复选框,可以强迫函数接受任何东西作为输入文件。

         上面显示,程序使用e:/mssdk/doc/misc/*.txt路径名,你可以看到程序的响应:图标和类型名是正确的(在我的PC上,文本文件的描述是‘Text Document

抱歉!评论已关闭.