在C#.NET中使用C ++中的COM对象返回object []

时间:2009-08-30 02:49:29

标签: c# c++ com variant

我有一个COM对象,我正在尝试使用C ++(而不是.NET),所有示例程序和手册都是在假设使用C#.NET或VB.NET的情况下编写的。 COM对我来说是新的,所以我有点不知所措。我在TLB上使用#import,但我正在努力处理用作参数的变体。我有一个特殊的方法,根据文档和C#.NET中的示例程序,应该返回一个对象[]。然后我应该将此数组中的第一个条目转换为ControlEvent,然后告诉我如何处理数组中的其余对象。 C#.NET示例如下所示:

object [] objEvent = (object []) Ctl.GetEvent();
ControlEvent ev = (ControlEvent) objEvent[0];

在我的情况下,GetEvent返回给我一个_variant_t,我需要知道如何将它转换为一个对象[],以便我可以进一步处理。我甚至不清楚如何用C ++表达'对象'。我看到_variant_t文档向我展示了我可以将变体转换为一百万件的东西,但它们似乎都没有转换为我可以使用的任何东西。我希望能帮助将上述C#.NET代码转换为Visual C ++

感谢。

2 个答案:

答案 0 :(得分:1)

通常,您会查看变体的vt成员,看看它实际上是什么类型的东西。在这种情况下,我希望它是一个数组,所以你会期望vartype会在VT_ARRAY上有一些变化(通常它与成员的类型按位OR运算)。然后,你得到parray成员,其中包含实际拥有数组的SAFEARRAY实例,并使用普通的安全数组函数从数组中获取数据。

答案 1 :(得分:1)

我没有这样做,但是通过阅读_variant_t课程的文档(以及下面的评论更正了我原来的帖子),我认为您应该阅读vt字段{ {1}}实例(实际上_variant_t实例的VARTYPE vt字段:VARIANT实例直接派生自_variant_t)以查看它包含的内容类型,如上所述在VARIANT结构的参考文档中。你知道变体中包含什么类型的东西,使用相应的特定于类型的运算符来读取它。

如果你试图在没有理解的情况下使用COM,你会受到一些伤害(你可能想要一本描述它的书);例如,您可能需要了解VARIANT界面和IUnknown方法。