代码之家  ›  专栏  ›  技术社区  ›  Erix

如何在IDL中通过C++ COM接口从C语言中传递布尔

  •  3
  • Erix  · 技术社区  · 15 年前

    我知道我错过了一些简单的东西,我几乎没有这些COM的经验。

    我想在IDL中的接口内执行此操作

    [id(5), helpstring("Returns true if the object is in a valid state.")]
    HRESULT IsValid([out, retval] boolean bValid);
    

    然而,这给出了:【out】参数不是指针。

    好吧,我理解。

    但是,在实现这一点的C代码中,我不能从方法isvalid()返回bool*,因为它是不安全的。

    返回布尔值的正确方法是什么?

    1 回复  |  直到 15 年前
        1
  •  7
  •   Daniel Earwicker    15 年前

    尝试:

    HRESULT IsValid([out, retval] VARIANT_BOOL *bValid);
    

    为了做一个输出,它必须是一个指向值的指针;这就是它将如何被写在C++一侧:

    *bValue = VARIANT_TRUE;
    

    我不知道你能不能把这个字写成 boolean -我只见过 VARIANT_BOOL 被使用。

    在C侧,它将相当于:

    public bool IsValid()
    

    换句话说,运行时可调用包装器(RCW)将实现方法签名的“更好”版本,并为您处理不安全的转换。如果C++实现返回 E_FAIL (或) E_WHATEVER ,则RCW的方法将 ComException .

    您也可以考虑添加 [propget] 属性,它将使 IsValid 可用作属性而不是方法。与任何属性一样,只有在评估成本较低且没有副作用的情况下才能这样做(调试器将在您单步执行C代码时对其进行评估)。