我已经搜索了网络和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对象中?感谢。
答案 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的提示。学到了一些新的和有用的东西。