getObject 函数在内部如何工作?

Posted

技术标签:

【中文标题】getObject 函数在内部如何工作?【英文标题】:How getObject Function internally works? 【发布时间】:2015-11-25 02:37:26 【问题描述】:

我正在使用 UFT 自动化 Inventor 2013,如下所示:-

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

这里我使用GetObject() 函数来获取运行 Inventor 应用程序的参考。 但我对GetObject() 函数有疑问

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

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

谁能解释一下?

【问题讨论】:

App Inventor 与 Autodesk Inventor 2013 不同。我为您更新了标签... 【参考方案1】:

您关闭错误检查,尝试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(文件名,ProgID)

CLSIDFromProgID 

CoCreateInstance 

QueryInterface for IPersistFile interface.

Load on IPersistFile interface.

QueryInterface to get IDispatch interface. 

GetObject(文件名)

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
);

【讨论】:

非常感谢您的回答,很多有用的信息肯定会帮助我。只是提醒一下错误代码是 429 ActiveX 组件无法创建对象。【参考方案2】:

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

GetObjectCreateObject 工作方式相似,但用途不同。 如果您需要创建对象的新实例,请使用 CreateObject。 如果需要引用对象的现有实例,请使用 GetObject。

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

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

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

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

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

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

Set wordApp = CreateObject ("Word.Application")

如果您省略路径名参数但保留逗号

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

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

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

【讨论】:

以上是关于getObject 函数在内部如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

sklearn 的 MLP predict_proba 函数在内部是如何工作的?

SignalR 如何在内部工作?

SqlDataAdapter 如何在内部工作?

ConcurrentHashMap 如何在内部工作?

PHP 的“未设置”构造如何在内部工作?

哈希:它在内部是如何工作的?