2009-08-04 27 views
3

私は単純なものが不足していることを知っています。私はIDLboolをc#からidlのC++ comインターフェイスに渡す方法

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

でインターフェイス内でこれを実行したいと思い

は、しかし、これは与える:[出] PARAMTERがポインタではありません。

わかりました。

しかし、これを実装するC#コードでは、安全でないためIsValid()メソッドからbool *を返すことはできません。

ブール値を返す正しい方法は何ですか?

答えて

7

試行:

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

出力として機能するためには、値へのポインタでなければなりません。私は今までVARIANT_BOOLが使用されて見てきました - あなたはbooleanようなタイプを記述することができるかどうかはわからない

*bValue = VARIANT_TRUE; 

:これはどのようにそれはC++側に書き込まれますです。 C#の側

、それと等価となるであろう:すなわち

public bool IsValid() 

、ランタイム呼び出し可能ラッパー(RCW)は、メソッドシグネチャの「よりよい」バージョンを実装し、安全でないの世話をしますあなたのための翻訳。 C++実装がE_FAIL(またはE_WHATEVER)を返した場合、RCWのメソッドはComExceptionをスローします。

IsValidをメソッドではなくプロパティとして使用できるように、[propget]属性を追加することをお勧めします。任意のプロパティと同様、評価するのが安価で副作用がない場合にのみ実行します(デバッガはC#コードをステップ実行する際に評価します)。

+0

これが機能しました。また、私はこのためにプロパティを使用する方法を考えていたので、私はあなたの2つの問題を解決しました。感謝! ありがとう! – Erix

関連する問題