【发布时间】: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