VBA CreateObject 与类型库引用

Posted

技术标签:

【中文标题】VBA CreateObject 与类型库引用【英文标题】:VBA CreateObject versus Type Library References 【发布时间】:2021-01-03 08:56:10 【问题描述】:

我已经通过 ATL 构建了一个 COM 对象,以便在 VBA 中使用已编译的 C++。我的类型库是(比如说)“MyObjLib”,对象是“MyObj”。

如果我在 VBA 中使用对象浏览器,一切看起来都不错:它将库显示为 MyObjLib,在其中我看到一个类 MyObj 作为库的成员。

如果在 VBA 中,我通过 References 菜单包含这个库,我可以这样写:

Dim obj as MyObj
Set obj = new MyObj

一切正常。但是,如果我尝试:

Dim obj as Object
Set obj = CreateObject("MyObjLib.MyObj")

失败并显示“运行时错误 429:ActiveX 组件无法创建对象。”

这很不幸,因为我现在想使用 Python 中的 COM 对象。有什么我想念的想法吗?

【问题讨论】:

检查 python 的位数与 COM dll 的位数(32 位与 64 位)。否则检查“progid”(“MyObjLib.MyObj”)确实是 ATL 寄存器。从技术上讲,它可能会有所不同。另外,使用 sysinternals 中的 Procmon 来监控注册表调用(过滤 exe)。 这都是来自 VBA 的第二次失败的地方吗?我问,因为如果都是 VBA,那么这不会是位问题,但可能与 ProgID 有关。在您的第一个示例中,它与 ProgID 无关。它可以从 typelib 中的 CLSID 创建对象。在第二个示例中,它必须从 ProgID 中查找 CLSID。假设第二个也是 VBA,那么正如 Simon 所说,看看 ProgID——它就在那里。而且,CLSID 与 TypeLib 中的内容相匹配。 如果第二个例子不是VBA,那么实际上将它放入VBA并以这种方式进行测试。 【参考方案1】:

感谢 cmets。我花了一些时间在我的 C++ 代码中搜索 ProgId。然后我偶然发现了另一个 SO 答案,关于有人在 ATL 简单 COM 对象向导中将 ProgId 字段留空......这正是我所做的!因此,我从未为该课程注册 ProgId(因此在注册表中没有 HKCR 条目)。

我使用向导创建了另一个项目,这次输入 ProgID 并将新项目中 .rgs 文件中的语法复制到我现有的文件中。

你好,CreateObject() 现在可以正常工作了。

【讨论】:

以上是关于VBA CreateObject 与类型库引用的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA后期绑定Microsoft DAO 3.6对象库

VBA_Excel_教程:字典类型

(VBA)Acrobat类型库的后期绑定(避免引用)

如何在 vbscript 中引用类型库(通常使用 xshell 库)

VBA 插件错误:“请求的类型库或向导不是 VBA 项目”

如何在vbscript中引用类型库(通常使用xshell库)