51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2378|回复: 2
打印 上一主题 下一主题

[原创] Getting or Creating an Object ?

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2010-6-26 19:48:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
经常看到 CreateObjectWScript.CreateObject 以及 GetObject 的用法,一直想知道它们的区别,虽然手册可以查到相关信息,但总是感觉比较模糊。终于在微软脚本中心找到了一篇文章:http://technet.microsoft.com/zh-cn/library/ee176980(en-us).aspx,经过自己的理解,简化的翻译了一下:

VBScript
CreateObject(servername.typename [, location])
GetObject([pathname] [, class])

WSH
object.CreateObject(strProgID[,strPrefix])
object.GetObject(strPathname [,strProgID], [strPrefix])

CreateObject  vs. GetObject

VBScript和WSH版本方法的区别将在后面介绍,目前关注VBScript版本的方法,因为大多数时候你使用的是VBScript版本的方法。这里的重点是理解CreateObject和GetObject的区别,什么时候使用CreateObject,什么时候使用GetObject。

VBScript CreateObject

当我们想创建一个对象的实例时,可以使用CreateObject方法,例如:要创建一个Excel的实例,可以按照如下方法创建:

Set objExcel = CreateObject("Excel.Application")

这样就拥有了一个指向Excel实例的引用objExcel,可以使用这个引用来调用方法或属性来操作Excel。

如下代码使用CreateObject创建Excel实例,使其可见,并且新建了一个工作簿:

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add

如下代码创建了两个独立的Excel实例:

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add

Set objExcel2 = CreateObject("Excel.Application")
objExcel2.Visible = True
Set objWorkbook = objExcel2.Workbooks.Add

运行这段脚本,会打开两个Excel实例,可以使用对象引用objExcel和objExcel2在脚本中分别控制这两个实例。

VBScript GetObject

现在我们知道创建对象可以直接调用CreateObject,为什么还需要GetObject呢?可以用它替换CreateObject吗?
先看如下代码:

Set objExcel = GetObject("Excel.Application")
objExcel.Visible = True

当你直接运行这段代码时,你会发现它提示你:无效的语法 ,因为不能直接使用GetObject替换CreateObject。

GetObject的作用是获取一个已经在运行的对象的一个引用。你可能会想通过CreateObject先创建一个Excel对象引用,然后通过调用GetObject来获得这个相同对象的另一个引用,就像这样:

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add

Set objExcel2 = GetObject("Excel.Application")

但是这段代码不会按你的意图去工作。

如下代码却可以正常工作:

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add

Set objExcel2 = GetObject(, "Excel.Application")
Set objWorkbook = objExcel2.Workbooks(1)
Set objWorksheet = objWorkbook.Worksheets(1)
objExcel2.Cells(1, 1).Value = 11

这段代码的GetObject跳过了第一个参数,而使用Excel.Application作为第二个参数,原文中作者没有进一步说明为什么这样用。而是建议如果要获取另一个引用的话,可以使用:

Set objExcel2 = objExcel

这个也是原文作者比较推崇的方法,因为这种方法至少你知道引用的是那个对象实例。假设已经有三个Excel实例在运行,运行如下代码后,你并不知道你改变了哪个实例:

Set objExcel2 = GetObject(, "Excel.Application")
Set objWorkbook = objExcel2.Workbooks(1)
Set objWorksheet = objWorkbook.Worksheets(1)
objExcel2.Cells(1, 1).Value = 11

所以大多数情况下,我们使用CreateObject创建对象。

当然也有例外的情况,最主要的是使用WMI和ADSI的时候,通常使用GetObject。这里只讲WMI,ADSI同样适用。

WMI与其他应用程序(如Excel)的工作方式的主要区别在于WMI一直在运行,即使你停止了WMI服务,当你尝试访问它时,它会再次启动。所以只要电脑在运行,WMI对象就是可访问的。因此不需要创建WMI对象,可以直接使用GetObject获得。下面代码是一个例子:

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")

关于WMI和ADSI更多信息请参考:http://technet.microsoft.com/zh-cn/scriptcenter/default.aspx

VBScript vs. WSH

VBScript与WSH方法最明显的区别是,使用WSH的CreateObject或GetObject方法时,方法前需要加上WScript,像这样:

Set objExcel = Wscript.CreateObject("Excel.Application")

当VBScript和WSH方法只有一个参数时,它们是等同的,当它们都使用两个参数时,两个版本的方法就完全不同了,如下代码:

Set objExcel = CreateObject("Excel.Application", "atl-ws-01")
Set objExcel = Wscript.CreateObject("Excel.Application", "Sub_")

第一句使用VBScript的CreateObject方法,第二个参数atl-ws-01表示一个远程机器名,整句代码表示在远程机器atl-ws-01上创建一个Excel实例;
如:
Set objExcel = CreateObject("Excel.Application", "atl-ws-01")
msgbox objExcel.Version

将打印出远程机器atl-ws-01上Excel实例版本号

第二句使用WSH的CreateObject方法,第二个参数Sub_表示一个子程序前缀,整句代码表示创建一个Excel本地实例,并同步这个实例的事件到以Sub_开头的子程序,当对象引发事件时,WSH将调用在事件名称开头附加了Sub_的子程序,例如对象引发的事件名为Maximize,则WSH将调用名Sub_Maximize的子程序,关于这种使用方法,参见:http://technet.microsoft.com/zh-cn/library/dd633287.aspx#EIAA


原文参考:http://technet.microsoft.com/zh-cn/library/ee176980(en-us).aspx
其他参考:http://blogs.msdn.com/b/ericlippert/archive/2004/06/01/145686.aspx

[ 本帖最后由 rojer521 于 2010-6-29 21:45 编辑 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2010-8-8 15:19:51 | 只看该作者
没人顶,自己顶
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2011-6-30 21:54:11 | 只看该作者
这个帖子一年了
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-10-2 08:35 , Processed in 0.103103 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表