|
经常看到 CreateObject 和 WScript.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 编辑 ] |
|