【问题标题】:VBA CreateObject versus Type Library ReferencesVBA CreateObject 与类型库引用
【发布时间】: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并以这种方式进行测试。

标签: vba com atl late-binding


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2017-10-14
    • 2015-02-05
    • 2012-08-01
    • 2014-07-28
    • 1970-01-01
    相关资源
    最近更新 更多