E_POINTERを返すときとE_INVALIDARGを返すとき
-
07-07-2019 - |
質問
COMインターフェイスメソッドは、さまざまな HRESULT
値を返し、無効な引数値が渡されたことを通知できます。いつ E_POINTER
を返し、 E_INVALIDARG
を返すのですか?
カプセル化されたコレクションでメソッドがインデックスを受け取り、それが E_INVALIDARG
である範囲外にある場合、私は理解しています。メソッドが、 E_POINTER
である新しく作成されたオブジェクトへのポインターを格納するための Interface **
ポインターを受け取った場合。
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;
}
しかし、ファイル名が&quot; in&quot;の 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
のルールは何ですか?
解決
out パラメーターのポインターへの参照がnullの場合、 E_POINTER
を返します。これは、プログラムまたは相互運用層。
たとえば、範囲外の問題または互いに衝突するパラメーターなどのパラメーターでアプリケーションレベルが存在する場合、 E_INVALIDARG
を返します。
あなたの場合、 SaveToFile(...)
で空のファイル名を渡すことは無効であるため E_INVLIADARG
を返し、 GetAttributes( ...)
値を入力できないため、 E_POINTER
(outパラメーターの場合)を返す必要があります。
そして、はい、私たちは皆L-O-V-E com:)