2009-08-30 113 views
0

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

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

在我的情况,GetEvent将返回我一个_variant_t,我需要知道如何将其转换为一个Object [],这样我可以进一步处理。它对我来说并不清楚,即使我用C++表达'对象'。我看到_variant_t文档向我展示了我可以将变体转换为的一百万个事物,但是他们中没有一个似乎转换为我可以使用的任何东西。我希望有一些帮助将上面的C#.NET代码转换为Visual C++

谢谢。

回答

1

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

+0

谢谢,我想你已经让我走上正轨。 VT是VT_ARRAY || VT_VARIANT,我从API调用中返回一个带有两个元素的SafeArray,每个元素都是一个VT_I4。然而,两者的lVal都为零,所以我仍然坚持我应该如何将这些VT_I4变成指向对象的指针 – bdk 2009-08-30 03:38:22

+0

你可以显示你用来检索'SAFEARRAY'元素并获得'VT_I4'的代码吗? – 2009-08-30 03:56:18

+0

_variant_t v = m_pCtl-> getNextEvent() printf(“Variant Type is%x \ n”,v.vt); [打印0x200c]] _variant_t项 LONG IDX = 0 HRESULT HR = SafeArrayGetElement(v.parray,&IDX,和项目) 如果(小时== S_OK) 的printf( “元素类型是:%d \ n” 个, item.vt); [[打印3]] – bdk 2009-08-30 04:12:20

1

我没有这样做,而是从阅读的_variant_t类的文档(以下管教我原来的职位的评论),我想你应该阅读_variant_t实例(实际上是VARTYPE vt领域的vtVARIANT实例:_variant_t实例直接从VARIANT派生)来查看它包含的是什么类型的东西,如VARIANT结构的参考文档中所述。你知道变体中包含什么类型的东西,使用相应的类型特定的操作符来读取它。

如果您尝试在不理解的情况下使用COM,那么您将会受到一些伤害(并且您可能需要一本描述该书的书);例如,您可能需要了解接口012和AddRef方法。

+0

除非需要将整个实例传递给某个外部接口,否则不要从_variant_t包装器中分离VARIANT实例。 _variant_t是一个智能的包装类,它可以作为底层实例或多或少的处理。 – 2009-08-30 03:03:05

+0

如何读取VARIANT的vt字段值(不分离VARIANT)?我没有在文档中看到_variant_t方法返回VARTYPE。 – ChrisW 2009-08-30 03:09:36

+0

你做了instance.vt - _variant_t实例直接从VARIANT派生 – 2009-08-30 03:11:45