我知道我错过了一些简单的东西,我对这些 com 东西几乎没有经验。
我想在一个 idl 的接口(interface)中执行此操作
[id(5), helpstring("Returns true if the object is in a valid state.")]
HRESULT IsValid([out, retval] boolean bValid);
但是这给出了:[out] 参数不是指针。
好的,我明白了。
但是,在实现它的 C# 代码中,我无法从方法 IsValid() 返回 bool*,因为它不安全。
返回 bool 值的正确方法是什么?
最佳答案
尝试:
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# 代码时对其进行评估)。
关于c# - 如何通过idl中的c++ com接口(interface)从C#传递bool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1229050/