c# - 如何通过idl中的c++ com接口(interface)从C#传递bool

标签 c# c++ com idl

我知道我错过了一些简单的东西,我对这些 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/

相关文章:

c# - 如果我查询 SQL Server VarBinary(MAX) 列,整个文件是否会加载到内存中?

c# - JSON.NET 不区分大小写的反序列化不起作用

c++ - 如何根据接口(interface)类型运行

c++ - 拦截 WM_PAINT 消息并据此采取行动

c# - 从字符声明字符串会产生意外结果。为什么会这样呢?

c# - 将值从代码隐藏传递到 Javascript

c++ - 如何创建 COM DLL(类库)?

php - 探索 PHP 中的 COM 对象

C++ : Data Structure withe fast searching and less memory requirements

c# - 无法从 COM 客户端实例化 DLL 中 2 个类中的 1 个