我正在使用ATL将旧的VB COM对象(我没写过)转换为C ++。根据IDL,其中一种方法使用IDispatch*
作为参数,此方法的文档和示例声明您可以传递一个字符串(这是将要创建和使用的对象的progid)通过控件)或IDispatch*
到已创建的对象。我怎么在ATL中实现这个呢?
例如,IDL:
[id(1)] HRESULT Test(IDispatch* obj);
样本(都是JScript):
obj.Test("foo.bar");
或
var someObject = new ActiveXObject("foo.bar");
obj.Test(someObject);
更重要的是,实现此方法的实际VB代码实际上将'obj'参数声明为字符串!但是,这一切似乎都有效。
你甚至可以将一个字符串传递给一个带IDispatch*
的COM方法吗?如果是这样,我可以确定IDispatch*
实际上是我的C ++ ATL代码中的字符串吗?更好的是,如果它是实现特定接口的IDispatch
,我将要在其上调用方法,或者如果它是字符串则实例化对象。
欢迎任何想法!
答案 0 :(得分:1)
声明方法,使其获取VARIANT参数并在运行时检查实际类型。
答案 1 :(得分:0)
如果您有VB6类obj
的实例Class1
并尝试将其分配给这样的基本类型
Dim str As String
str = obj
...然后评估Class1
的默认属性。同样的规则适用于方法调用
Function MyFunc(str As String)
...
End Function
MyFunc obj
只有Class1
定义了默认属性且obj
的默认属性值可以转换为String
时,最后一次方法调用才会成功。