发信人: 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]
|
|