使用C++;在C#.NET中返回object[] < >我有一个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,我需要知道如何将其转换为对象[],以便进一步处理。对我来说,即使在C++中如何表达“对象”也不清楚。我看到_variant_t文档向我展示了一百万种我可以将变体转换成的东西,但它们似乎都没有转换成我可以使用的任何东西。我希望能帮助把C++的.NET代码转换成VisualC++/P>使用C++;在C#.NET中返回object[] < >我有一个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];,c#,c++,com,variant,C#,C++,Com,Variant,在我的例子中,GetEvent将返回一个_variant,我需要知道如何将其转换为对象[],以便进一步处理。对我来说,即使在C++中如何表达“对象”也不清楚。我看到_variant_t文档向我展示了一百万种我可以将变体转换成的东西,但它们似乎都没有转换成我可以使用的任何东西。我希望能帮助把C++的.NET代码转换成VisualC++/P> 谢谢。通常,您会查看变体的vt成员,以了解它实际上是什么类型的东西。在本例中,我希望它是一个数组,所以您希望vartype是VT_数组的一些变体(通常它是按位
谢谢。通常,您会查看变体的
vt
成员,以了解它实际上是什么类型的东西。在本例中,我希望它是一个数组,所以您希望vartype是VT_数组的一些变体(通常它是按位或按成员类型排列的)。然后,您将获得parray
成员,该成员包含实际持有数组的SAFEARRAY
实例,并使用普通的SAFEARRAY函数从数组中获取数据。我没有这样做,但是通过阅读\u variant
类的文档(下面的评论更正了我原来的帖子),我认为你应该阅读\u variant\u t
实例的vt
字段(实际上variant
实例的VARTYPE vt
字段:\u variant\u code>实例直接来自variant
)要查看它包含什么类型的内容,如VARIANT
结构的参考文档中所述。如果您知道VARIANT中包含什么类型的内容,请使用相应的特定于类型的运算符来阅读它
如果你试图在不理解COM的情况下使用它,你会受到一些伤害(你可能需要一本书来描述这一点);例如,您可能需要了解IUnknown
接口和AddRef
方法。除非您需要将变量实例整体传递给某个外部接口,否则您不会将变量实例与_VARIANT包装分离。_VARIANT是一个智能包装类,可以或多或少地视为基础实例eHow else(不分离变体)你读过VARIANT的vt字段值吗?我在文档中没有看到返回VARTYPE的_VARIANT|t方法。你读instance.vt-这个_VARIANT| t实例直接从variantHanks派生,我想你已经把我放在正确的轨道上了。vt是vt|u ARRAY | vt|u VARIANT,我从API调用中得到一个SafeArray w/两个元素,每个元素这是一个VT_I4。但是两者的lVal都是零,所以我仍然在想如何将这些VT_I4转换为指向对象的指针。扫描您显示用于检索SAFEARRAY
元素并获得VT_I4
?\u variant\t v=m_pCtl->getNextEvent()printf的代码(“variant Type是%x\n”,v.VT);[[Prints 0x200c]]如果(hr==S_OK)printf(“元素类型是:%d\n”,item.vt);[[prints 3]]如果返回值是指向对象的指针,则类型将是vt_DISPATCH或vt_UNKNOWN-因为它是vt_I4,所以该方法返回某种整数值。