为什么C对象传递给COM方法';s VARIANT*参数已转换为VT_调度类型

为什么C对象传递给COM方法';s VARIANT*参数已转换为VT_调度类型,com,marshalling,variant,Com,Marshalling,Variant,我有一个ATL COM服务,它公开了一个方法,该方法将[in,out]变量指针作为参数 例如,对于COM接口,我有以下方法,例如IMyApiCom: HRESULT Action([in, out] VARIANT* EmptyObj); 我编写了一个C#客户机应用程序,调用如下: MyApiCom myapi = new MyApiCom(); Object emptyObj = new Object(); myapi.Action(ref emptyObj); 现在,当我调试COM服务并

我有一个ATL COM服务,它公开了一个方法,该方法将[in,out]变量指针作为参数

例如,对于COM接口,我有以下方法,例如IMyApiCom:

HRESULT Action([in, out] VARIANT* EmptyObj);
我编写了一个C#客户机应用程序,调用如下:

MyApiCom myapi = new MyApiCom();
Object emptyObj = new Object();
myapi.Action(ref emptyObj);
现在,当我调试COM服务并检查
EmptyObj
是如何初始化的时,它的类型是VT_DISPATCH,而我希望它是VT_EMPTY。这给我带来了一个问题,尽管可以很容易地解决(通过将其设置为VT_EMPTY)

为什么我希望它是VT_EMPTY的原因放在一边,我只是想知道为什么它被初始化为VT_DISPATCH而不是VT_EMPTY


另外,是否可以传递类型为VT_EMPTY的对象?

要在ATL端获得VT_EMPTY,只需在托管代码中传递null(VB中为Nothing,C++/CLI中为nullptr)

参考:


要使ATL端的VT_为空,只需在托管代码中传递null(VB中为Nothing,C++/CLI中为nullptr)

参考:


我一直认为null不是[in,out]参数的有效参数。我的无知再次证明我错了。非常感谢。在您的原始代码中发生的是,
emptyObj
是.NET对象的一个实例,碰巧是System.object类型,但是.NET interop并不关心。为它创建了一个CCW,并将CCW的IDispatch放置在参数中。我一直认为null不是[in,out]参数的有效参数。我的无知再次证明我错了。非常感谢。在您的原始代码中发生的是,
emptyObj
是.NET对象的一个实例,碰巧是System.object类型,但是.NET interop并不关心。将为其创建CCW,并在参数中放置CCW的IDispatch。