インターフェイスを実装するときCOM
、成功時には常に out パラメータに割り当てますが、エラー時にも割り当てる必要がありますか?
HRESULT CDemo::Div(/*[in]*/ LONG a, /*[in]*/LONG b, /*[out,retval]*/ LONG* pRet)
{
if (pRet == NULL)
return E_POINTER;
if (b == 0)
{
*pRet = 0; // is this redundant?
return E_INVALIDARG;
}
*pRet = a/b;
return S_OK;
}
かつて、out パラメーターを初期化せず、変数を初期化した場合、メソッド内で変更しなければその値のままであると仮定して、鼻を噛まれました。ただし.NET
、マーシャラーはこれが[out]
パラメーターであることを認識しているため、呼び出しサイトに配置した初期値を破棄し、関数が返された後にガベージに入れました (それをデバッグするのは楽しかったです)。
障害過補償でもパラメーターに割り当ててout
いますか、それとも本当に行うべきですか?
編集:関数が失敗した場合、正式にはパラメータにアクセスするべきではありませんが、私はしばしば次のようなコードを目にします(そして時々書く)( sharptoothの投稿の例を使用):
ISmth *pSmth = NULL;
pObj->GetSmth(&pSmth); // HRES is ignored
if (pSmth) // Assumes that if GetSmth failed then pSmth is still NULL
{
pSmth->Foo();
pSmth->Release();
}
これは、マーシャリングされていないコード (同じスレッド アパートメント) では正常に機能しますが、マーシャラーが関与している場合、関数が成功した場合にのみ戻り値を設定するのに十分スマートですか?