2009-08-04 95 views
3

我知道我错过了一些简单的东西,我旁边没有这些COM的经验。如何从c#通过bool通过c + + com接口在IDL

我想在一个IDL

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

一个界面中,要做到这一点然而这给:[出]放慢参数不是指针。

好吧,我明白了。

然而,在执行本C#代码,我不能从方法IsValid(),因为它是不安全的返回一个bool *。

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

回答

7

尝试:

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#代码时对其进行评估)。

+0

这工作。此外,我想知道如何使用这个属性,所以你解决了我的两个问题。 谢谢! – Erix 2009-08-04 18:33:56