【问题标题】:Why C# Object passed to COM method's VARIANT* parameter converted to VT_DISPATCH type为什么 C# 对象传递给 COM 方法的 VARIANT* 参数转换为 VT_DISPATCH 类型
【发布时间】:2013-07-31 08:16:37
【问题描述】:

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

例如,我有以下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 类型的对象?

【问题讨论】:

    标签: com marshalling variant


    【解决方案1】:

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

    参考:

    【讨论】:

    • 我一直认为 null 不是 [in, out] 参数的有效参数。我的无知再次证明我错了。谢谢!
    • 在您的原始代码中发生的事情是 emptyObj 是一个 .NET 对象的实例——它碰巧是 System.Object 类型的——但 .NET 互操作不在乎。为它创建了一个 CCW,并将一个指向 CCW 的 IDispatch 放在参数中。
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 2019-03-02
    相关资源
    最近更新 更多