使用用c ++编写的旧com对象在VBA中“无效使用New Keyword”

时间:2014-08-14 13:31:38

标签: c++ vba com

我已经搜索了网络和stackoverflow这个答案,但找不到任何东西。我在C ++中编写了一个com对象(第一次),当在vbscript中使用时,在可执行文件中通过cocreateinstance。所以我决定看看它是否适用于Excel VBA。

所以我进入了“参考文献”并将我的对象放在那里。选中此框并开始编码。以下是VBA代码。

Function doCos(x As Double) As Double
  Dim t As SimpleLib.IMath
  Set t = New SimpleLib.IMath ' <- "Invalid use of New keyword" error here
  doCos = t.Cos(x)
End Function

Intellisense在Dim语句中识别我的对象,但在使用Set语句时它不会出现。显然我使用的是注册类型库,否则intellisense根本不起作用。同样,com对象可以在vbscript或可执行文件中使用,但由于某种原因,至少使用new关键字,在VBA中不能使用。

有没有人知道可能有什么问题,或者可能需要添加到com对象中?感谢。

1 个答案:

答案 0 :(得分:1)

一种方法是在IDL中定义一个包含所需接口的coclass(在我的情况下为IMath)。注意:默认情况下隐藏[default]接口。所以我只是将interface IUnknown定义为默认值。使用MIDL编译后,会生成一个类型库,应该使用regtlibv12.exe注册。

然后我在DllGetClassObject中添加了一个额外的IF语句,如if (rclsid == CLSID_Math),其中CLSID_Math对应于从MIDL自动生成的文件中定义的CLSID。我所做的就是从if ( rclsid == IID_IMath )复制并粘贴IF语句的主体,更新了DLLRegisterServer和DLLUnRegisterServer函数,重新编译了项目,并重新编译了regsvr32.exe。

所以现在以下工作。

Function docos(x As Double) As Double
  Dim a As SimpleLib.IMath
  Set a = New SimpleLib.Math
  docos = a.Cos(x)
End Function

感谢Hans关于coclass的提示。学到了一些新的和有用的东西。