将IDispatch *转换为字符串?

时间:2010-02-24 18:24:09

标签: c++ com atl

我正在使用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,我将要在其上调用方法,或者如果它是字符串则实例化对象。

欢迎任何想法!

2 个答案:

答案 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时,最后一次方法调用才会成功。