VBA CreateObject 与类型库参考
VBA CreateObject versus Type Library References
我已经通过 ATL 构建了一个 COM 对象,以便在 VBA 中使用已编译的 C++。我的类型库是(比如)“MyObjLib”,对象是“MyObj”。
如果我在 VBA 中使用对象浏览器,一切看起来都不错:它向我显示库作为 MyObjLib,并且在其中我看到 class MyObj 作为库的成员。
如果在VBA中,我通过引用菜单包含这个库,我可以写:
Dim obj as MyObj
Set obj = new MyObj
一切正常。但是,如果我尝试:
Dim obj as Object
Set obj = CreateObject("MyObjLib.MyObj")
它因“运行时错误 429:ActiveX 组件无法创建对象”而失败。
这很不幸,因为我现在想使用来自 Python 的 COM 对象。有什么想法我想念的吗?
感谢您的评论。我花了一些时间在我的 C++ 代码中搜索 ProgId。然后我偶然发现了另一个 SO 答案,关于有人在 ATL 简单 COM 对象向导中将 ProgId 字段留空......这正是我所做的!因此,我从未为 class 注册过 ProgId(因此在 Registy 的 HKCR 中没有条目)。
我使用向导创建了另一个项目,这次输入了一个 ProgID,并将语法从新项目中的 .rgs 文件复制到我现有的项目中。
嗨,转眼间,CreateObject() 现在可以正常工作了。
我已经通过 ATL 构建了一个 COM 对象,以便在 VBA 中使用已编译的 C++。我的类型库是(比如)“MyObjLib”,对象是“MyObj”。
如果我在 VBA 中使用对象浏览器,一切看起来都不错:它向我显示库作为 MyObjLib,并且在其中我看到 class MyObj 作为库的成员。
如果在VBA中,我通过引用菜单包含这个库,我可以写:
Dim obj as MyObj
Set obj = new MyObj
一切正常。但是,如果我尝试:
Dim obj as Object
Set obj = CreateObject("MyObjLib.MyObj")
它因“运行时错误 429:ActiveX 组件无法创建对象”而失败。
这很不幸,因为我现在想使用来自 Python 的 COM 对象。有什么想法我想念的吗?
感谢您的评论。我花了一些时间在我的 C++ 代码中搜索 ProgId。然后我偶然发现了另一个 SO 答案,关于有人在 ATL 简单 COM 对象向导中将 ProgId 字段留空......这正是我所做的!因此,我从未为 class 注册过 ProgId(因此在 Registy 的 HKCR 中没有条目)。
我使用向导创建了另一个项目,这次输入了一个 ProgID,并将语法从新项目中的 .rgs 文件复制到我现有的项目中。
嗨,转眼间,CreateObject() 现在可以正常工作了。