Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用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 - Fatal编程技术网

使用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#.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_数组的一些变体(通常它是按位

在我的例子中,GetEvent将返回一个_variant,我需要知道如何将其转换为对象[],以便进一步处理。对我来说,即使在C++中如何表达“对象”也不清楚。我看到_variant_t文档向我展示了一百万种我可以将变体转换成的东西,但它们似乎都没有转换成我可以使用的任何东西。我希望能帮助把C++的.NET代码转换成VisualC++/P>
谢谢。

通常,您会查看变体的
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,所以该方法返回某种整数值。