精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VFP>>〖外部引用〗>>译文:使用Shell.Application对象

主题:译文:使用Shell.Application对象
发信人: fbilo()
整理人: hunter__fox(2002-03-16 23:09:59), 站内信件
使用Shell.Application对象

作者:George Tasker,Microsoft MVP
译者:fbilo [email protected]
更多的文章请访问foxer资料站:http://fbilo.myrice.com


关于Windows COM对象最好的一件事是它们帮助你简化你的程序员生涯。其中的
一个Shell.Application,不论在设计时还是运行时都会对你有所裨益。在这篇文
章里,我们将接触这个对象的两个方法。其中一个可以在设计时使用,另一个用
于运行时。

在我们继续深入以前,有一个重要的问题需要回答。你怎么知道你是否能使用S
hell.Application对象?另外,如果你没有安装它,要怎么去找到它?不幸的是,
第一个问题容易回答,而第二个则不然。

你安装了Shell.Application对象吗?

你要做的第一件事,是确定是否已经安装了Shell.Application对象。它由Shel
l32.dll的4.71版及更高版本所提供。最好首先检查注册表以确定是否已安装了它
,然后检查它的版本号。正常的情况下,注册表也许会认为Shell.Application对
象是可用的,但由于它的某些功能需要更高的版本,所以你仍然需要检查Dll文件
的版本号。使用VFP6开发类库中的Registry类可以做到这一点很简单:

SET CLASSLIB TO REGISTRY.VCX
oReg = CREATEOBJECT("Registry")
IF oReg.IsKey("Shell.Application")
?= AGETFILEVERSION(a_ver, "shell32.dll")
?? (a_ver[4] >= "4.71"
ELSE
?? "Not installed"
ENDIF

如果你使用的是VFP 6.0以前的版本,你可以使用foxtools 库中的 GetFileVer
sion() 来检查版本号。

如果没有安装,那么安装它成了个问题。为什么呢?首先,这个Dll是WINDOWS 
98和 2000自带的。它还附带于Internet Explorer 4.01 (但 5.0 中没有), 另外
,WINDOWS NT 的一个 service packs 中也带有它。所以,如果你没有WIN98 或
 2000,或者你使用NT,但没有安装最新版本的service packs。你就不能访问这
个对象。在这样的情况下,安装它唯一可行的办法是:卸载IE 5.0,安装4.01,
然后升级到5.0。这个信息在MSDN中是找不到的。

设计时使用

假设你已经安装了这个对象,建立一个它的实例就象建立任何一个OLE自动化服
务器的实例一样:

oShell = CREATEOBJECT("Shell.Application")

在VFP中,FoxPro for Windows 的一个功能—文件管理工具—消失了。Microso
ft作了一个有用的替代品,放在它的网页上以供下载。然而,Shell.Applicatio
n 对象包含了一个也许更有效的方法:FindFile方法。虽然Microsoft已经发行了
一个文件管理工具,而且比原来的版本提供了更多的功能,但它仍有一些缺点不
如FindFile 方法的。

 FindFile 调用与 Windows Explorer 同样的对话框。它可以查找带有指定字符
的文件、在指定日期范围内修改或是指定的文件类型的文件。一旦应用程序对象
已经建立,执行它很简单,只要从命令窗口键入以下命令:

oShell.FindFiles

你将看到WINDOWS资源管理器的查找文件对话框,这将允许你输入一个或多个扩
展名来从你的硬盘查找符合扩展名的文件,还可以指定它包含指定的字符、并且
/或在一个你指定的日期范围内编辑/建立。但它完成的时候,你只需要拖放文件
到命令窗口,VFP会用合适的方法打开它。如果使用文件管理工具,你只能打开程
序文件和文本文件。Find Files 允许你做的要多的多。

使用文件管理工具,你不能查找报表、窗体或表然后用“编辑”按扭打开它们。
当这些文件从 Find Files 拖放到命令窗口中时,它们会在相应的设计器中被打
开。

运行时应用
**********

许多程序员都会碰到这样的情况:系统需要从一个位置拷贝/移动一个或多个文
件到另一个位置。虽然FoxPro已经提供了这种功能,但还是有两个明显的缺点:
首先 COPY FILE 命令不支持通配符,这意味这你必须执行一个命令许多次,例如
拷贝一个表和它的索引、备注文件;其次,没有一个象 Windows Explorer 在拷
贝文件时出现的进程对话框。结果,你只能用没有吸引力的类似一个wait windo
w 窗口或建议用户 "Please wait Copying files"的东东来代替。

 Shell.Appplication 对象可以通过提供象 Windows Explorer 一模一样的对话
框来解决这个问题。甚至它可以对拷贝文件进程进行更多的控制。

为了使你更深的理解它,你必须了解一些进程默认的常量。它们被包含在 VC++
目录下的Shelobj.h文件中。下面是一些这个对象使用的常量:

#define FOF_NOCONFIRMATION 0x0010 && 覆盖时不提示
#define FOF_FILESONLY 0x0080  && 默认*.*,可操作任何文件 
#define FOF_SIMPLEPROGRESS 0x0100  && 操作多个文件时不显示文件名
#define FOF_NOCONFIRMMKDIR 0x0200  &&需要建立目录时不需确认
#define FOF_NOERRORUI 0x0400  && 不提供错误界面

为了移动/拷贝多个文件或文件夹,我们需要一个文件夹对象。如果需要的文件
夹不存在,我们必须首先建立它。当然,这可以用DIRECTORY()函数来检查、MKD
IR命令来建立。为了得到文件夹的属性,我们需要做的是调用shell对象的 Name
Space()方法,传递需要的文件夹名作为一个参数。

oFolder = oShell.NameSpace("C:\My Folder")

这个对象有两个方法:CopyHere 和 MoveHere 。它们基本的语法是相同的。

oFolder.CopyHere(< 源 >[, 选项标志])

源参数可以有多种形式,它可以是带路径和通配符的文件名,如: C:\SourceD
ir\*.prg,在这个例子里所有的程序文件将被拷贝或移动;它也可以只是一个路
径,在一个只提供完整路径结构的例子里,源路径被拷贝或移动。

选项标志参数可以是任何上面列出的常量的组合。默认的情况下(如果这个参数
被忽略),这个方法将显示带文件名的进程对话框、将提示文件或文件夹是否存
在、将提示是否建立路径、并且将拷贝或移动路径。

以后会发生的事情取决于你想干什么。例如,如果你想要拷贝报表文件从一个位
置到另一个位置:

oFolder.CopyHere("C:\Reports\*.FR?")

将做到这一点。另外,如果那儿已经有同样文件名的文件存在,你将看到一个标
准的 Windows 对话框提示你是否覆盖。如果你想设置默认未覆盖:

oFolder.CopyHere("C:\Reports\*.FR?", FOF_NOCONFIRMATION)

在有大量文件的情况下,你也许对 FOF_SIMPLEPROGRESS (操作多个文件时不显
示文件名)选项感兴趣。当对话框拷贝文件的时候,这将防止对话框显示文件名
。因为取消了额外的屏幕I/O,进程的速度会加快。但是,用户将只能得到进程栏
和剩余时间标题的反馈。所以,要根据环境的条件来判断是否使用这个选项。

在我看来,使用这个技术最漂亮的一点是,用适当的选项,你可以拷贝或移动整
个路径树,例如:

oFolder.CopyHere("C:\Source", FOF_NOCONFIRMATION + FOF_NOCONFIRMMKDIR
)

拷贝整个目录到目的文件夹。没有文件已经放在那里,并且源路径的内容被放在
目的下的一个新路径中,在所有路径中的所有文件都被拷贝。

其它内容
********

我在这里试图做的是给你一个使用 Shell.Application 对象的尝试。还有更多
的吗?当然了,还有一个 BrowseForFolder 方法,它给出一个跟刚才使用的相似
的对话框,使你可以从 FindFiles 对话框中选择一个文件夹用“浏览”按钮查找
。另外还有 CascadeWindows, TileVertically, 和 TileHorizontally 方法,等
等。我在这里只是演示了一个片断而已。

学习它的最好的资源是随着 MSDN 发布的 SHELLCC.CHM 帮助文件。如果你没有
 MSDN 资料库但你是一个 VFP 的注册拥有者,你可以从 VFP 主页上免费订阅一
年。如果你已经安装了资料库,选择“目录”页,进入 Windows Shell\Shell R
eference\Shell 对象和 Scripting for Visual Basic 以得到更多有用的信息。
(译者注:我手中的 MSDN似乎跟上面的不同,要查找 Windows shell api。)虽
然大多数内容适用于 VB 或 VBScript 程序员,但 VB 和 VFP 在这方面的语法是
类似的,可以简单的实现转换。

George Tasker
mailto:[email protected]


foxer资料站保留所有的权利,如欲转载或出版,请与我联系:[email protected]



--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.130.72.73]

[关闭][返回]