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】: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 返回指定类型的新对象实例。如果省略路径名参数,GetObject 返回指定类型的当前活动对象。如果不存在指定类型的对象,则会发生错误。
如果您指定 ProgID 而不是路径名,则结果会因您设置参数的方式而异。如果您将空字符串作为代码中的第一个参数传递,例如
Set wordApp = GetObject("", "Word.Application")
VBScript 返回 Word 应用程序对象的新实例(即表示 Word 应用程序的对象)。此 GetObject 调用等效于 CreateObject 调用
Set wordApp = CreateObject ("Word.Application")
如果您省略路径名参数但保留逗号
Set wordApp = GetObject (, "Word.Application")
如果存在,VBScript 将返回 Application 对象的现有实例。
有关详细信息,请查看 this 和 this 链接。
【讨论】:
以上是关于getObject 函数在内部如何工作?的主要内容,如果未能解决你的问题,请参考以下文章