10

COMインターフェイスメソッドはHRESULT、渡された無効な引数値を通知するためにさまざまな値を返すことができます。E_POINTERいつ戻るのE_INVALIDARGですか?

私が理解しているように、メソッドがカプセル化されたコレクションのインデックスを受け取り、それが範囲外であるかどうかE_INVALIDARGInterface**メソッドが、新しく作成されたオブジェクトへのポインタを格納することを目的としたポインタを受け取った場合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*しかし、「in」パラメーターとしてファイル名を持つバッファーを受け取り、これ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ポインタ型パラメータをチェックするかについての規則は何ですか?

4

1 に答える 1

12

outE_POINTERパラメーターのポインターへの参照が null の場合に戻ります。これは、プログラムまたは相互運用レイヤーのバグを示すエラー コードと見なされます。

E_INVALIDARG範囲外の問題やパラメーター同士が衝突するなど、パラメーターでアプリケーション レベルがオンになっている場合に戻ります。

あなたの場合、空のファイル名を渡すことは無効であるため、inにSaveToFile(...)戻り、値を入力できないため (out パラメータの場合) inに戻る必要があります。E_INVLIADARGGetAttributes(...)E_POINTER

そして、はい、私たちは皆comが大好きです:)

于 2009-09-15T12:27:14.277 に答える