COMインターフェイスメソッドは、さまざまなHRESULT
値を返して、渡された無効な引数値を通知します。いつE_POINTER
を返しますか?E_INVALIDARG
?E_POINTERを返し、E_INVALIDARG?
メソッドがカプセル化されたコレクション内のインデックスを受け取り、それが範囲外であることがわかっているとして、E_INVALIDARG
です。メソッドがInterface**
ポインタを受け取る場合、それはE_POINTER
の新しく作成されたオブジェクトへのポインタを格納するためのものです。
HRESULT CImpl::GetItem(long index; Interface** result)
{
if(result == 0) {
return E_POINTER;
}
if(index < 0 || index >= internalArray.size()) {
return E_INVALIDARG;
}
*result = CreateWrapperObject(internalArray[index]);
return S_OK;
}
しかし、それは、パラメータ「中」などのファイル名でWCHAR*
バッファを受け取り、このWCHAR*
がnullの場合?これはE_POINTER
ですか、E_INVALIDARG
ですか?
メソッドは、ある構造体へのポインタを受け取り、そのポインタを介して構造体を埋めると予想され、このポインタはnullです。これはE_POINTER
またはE_INVALIDARG
ですか?
HRESULT CImpl::SaveToFile(WCHAR* fileName)
{
if(fileName == 0) {
return // what to return here?
}
//... do actual work here
}
HRESULT CImpl::GetAttributes(Attributes* to)
{
if(to == 0) {
return // what to return here?
}
attributes->IsCool = getIsCool();
attributes->Color = RGB(0, 255, 0);
return S_OK;
}
E_POINTER
を返すときのためのルールやE_INVALIDARG
チェックポインタ型のパラメータは何ですか?
ドキュメント参照はありますか? – Constantin
合意。私は本当にこのためのMSDNのリファレンスを見たいと思います。上記は何らかの意味を持ちますが、標準的な定義を持つことは良いことです。 –
この回答が正しいかどうかわかりません。たとえば、VS2010の ''の 'AtlSetChildSite()'実装では、 'punkChild'パラメータが' NULL'ならば、この答え(正確に理解すれば)の代わりに 'E_POINTER'が返され、' E_INVALIDARG 'その場合返されているはずです。私はATLは良いCOMプログラミングの良いソースだと思うので、無効な(例えば 'NULL')ポインタの一般的な場合には' E_POINTER'を返すべきでしょう。しかし、率直に言っても私はどちらか分かりませんが、私はMSDNの公式の参考文献が良いだろうと同意します。 'pVar'(' _In_ VARIANT *が ') 'NULLである場合' E_POINTER'が返され、 'PutProperty()'の実装体において、 '' CComPtr 専門に、同じ '' ヘッダに、混乱に追加する –