IDLのC ++ COMインターフェースを介してC#からブールを渡す方法

StackOverflow https://stackoverflow.com/questions/1229050

  •  22-07-2019
  •  | 
  •  

質問

単純なものが欠けていることはわかっていますが、これらの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#コードをステップ実行するときに評価します)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top