質問

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:)

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