IDLのC ++ COMインターフェースを介してC#からブールを渡す方法
質問
単純なものが欠けていることはわかっていますが、これらの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 *を返すことはできません。
ブール値を返す正しい方法は何ですか?
解決
試してください:
HRESULT IsValid([out, retval] VARIANT_BOOL *bValid);
出力として機能するには、値へのポインターである必要があります。これは、C ++側での書き込み方法です。
*bValue = VARIANT_TRUE;
型を boolean
として記述できるかどうかわからない-使用されているのは VARIANT_BOOL
だけだ。
C#側では、次と同等になります。
public bool IsValid()
つまり、ランタイム呼び出し可能ラッパー(RCW)は、「nicer」を実装します。メソッドシグネチャのバージョンと安全でない翻訳の世話をします。 C ++実装が E_FAIL
(または E_WHATEVER
)を返す場合、RCWのメソッドは ComException
をスローします。
[propget]
属性を追加することも検討できます。これにより、 IsValid
がメソッドではなくプロパティとして使用可能になります。他のプロパティと同様に、評価が安くて副作用がない場合にのみこれを行います(デバッガはC#コードをステップ実行するときに評価します)。
所属していません StackOverflow