getObject函数内部如何工作?

时间:2015-08-31 06:02:30

标签: vbscript qtp autodesk

我使用UFT自动化Inventor 2013如下: -

Set oApp = GetObject(,"Inventor.Application") Set oDoc = oApp.ActiveDocument

我在这里使用GetObject()函数来获取运行Inventor Application的参考。 但我对GetObject()功能

有疑问

1)如何发现任何应用程序存在或处于运行状态?

2)它如何访问特定应用程序的头类,以便我们访问该应用程序类的所有方法和属性?

任何人都能解释一下吗?

2 个答案:

答案 0 :(得分:5)

GetObject CreateObject 是VBScript提供的COM自动化的一部分。 VBScript无法使用Windows提供的所有COM对象。 VBScript只能使用那些公开称为程序标识符( ProgID )的字符串的对象。虽然并非所有COM对象都具有ProgID,但所有COM对象都具有128位数字,称为类标识符或CLSID。如果COM对象具有ProgID,则可以使用VBScript实例化对象,调用其方法和属性,并销毁该对象。

GetObject CreateObject 在某种程度上类似,但它们有不同的用途。
如果需要创建对象的新实例,请使用CreateObject 如果需要引用对象的现有实例,请使用GetObject。

GetObject 函数有两个可选参数:object's pathname(即完整路径和文件名)和object's ProgID。虽然两个参数都是可选的,但您必须至少指定一个。如果省略两个参数,则会产生错误。例如:

Dim wordDoc
Set wordDoc = GetObject ("FilePath\FileName.doc")

执行此代码时,将启动与指定路径名关联的应用程序,并激活指定文件中的对象。如果pathname是零长度字符串(""),则GetObject返回指定类型的新对象实例。如果省略pathname参数,则GetObject返回指定类型的当前活动对象。如果不存在指定类型的对象,则会发生错误。

如果指定ProgID但不指定路径名,则结果会因您设置参数的方式而异。如果将空字符串作为代码中的第一个参数传递,例如

Set wordApp = GetObject("", "Word.Application")

VBScript返回Word的Application对象的新实例(即,表示Word应用程序的对象)。此GetObject调用等效于CreateObject调用

Set wordApp = CreateObject ("Word.Application")

如果省略pathname参数但保留逗号

Set wordApp = GetObject (, "Word.Application")

VBScript返回Application对象的现有实例(如果存在)。

有关详细信息,请查看 this this 链接。

答案 1 :(得分:0)

您关闭错误检查,尝试GetObject,然后测试err.number <> 0。如果发明人正在运行,则呼叫将成功,err.number将为0,否则将424错误(我认为)。

GetObject的每个变体的API调用详见https://msdn.microsoft.com/en-us/library/windows/desktop/ms221192(v=vs.85).aspx

从上面的链接。

GetObject(filename,ProgID)

CLSIDFromProgID 

CoCreateInstance 

QueryInterface for IPersistFile interface.

Load on IPersistFile interface.

QueryInterface to get IDispatch interface. 

GetObject(filename)

CreateBindCtx creates the bind context for the subsequent functions.

MkParseDisplayName returns a moniker handle for BindMoniker.

BindMoniker returns a pointer to the IDispatch interface.

Release on moniker handle.

Release on context.

GetObject(ProgID)

CLSIDFromProgID 

GetActiveObject on class ID.

QueryInterface to get IDispatch interface. 

您可以在此处查找每个函数调用

https://msdn.microsoft.com/en-us/library/windows/desktop/ms680586(v=vs.85).aspx

EG

  

CLSIDFromProgID功能

     

在给定ProgID的情况下在注册表中查找CLSID。

     

<强>语法

HRESULT CLSIDFromProgID(
  _In_  LPCOLESTR lpszProgID,
  _Out_ LPCLSID   lpclsid
);