Pergunta

Com interfaces de métodos podem retornar vários valores HRESULT para sinalizar valores dos argumentos inválidos passados. Quando eu voltar E_POINTER e quando E_INVALIDARG?

Como eu entendo se um método recebe um índice em uma coleção encapsulado e é fora dos limites que é E_INVALIDARG. Se um método recebe um ponteiro Interface** onde pretende armazenar um ponteiro para um objeto recém-criado que é 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;
}

Mas o que se receber um tampão WCHAR* com um nome de arquivo como um "em" parâmetro e este WCHAR* é nulo? É este E_POINTER ou E_INVALIDARG?

Ou um método recebe um ponteiro para alguns struct e é esperado para preencher o struct através desse ponteiro e este ponteiro é nulo - é este E_POINTER ou 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;
}

Quais são as regras para quando retornar E_POINTER e quando E_INVALIDARG ao verificar parâmetros de tipo ponteiro?

Foi útil?

Solução

Você retorna E_POINTER quando a referência para o ponteiro de um parâmetro fora é nulo, este considera ser um código de erro que indica um erro no programa ou na camada de interoperabilidade.

Você retorna E_INVALIDARG quando há um nível de aplicação com o parâmetro, por exemplo, fora de questão intervalo ou parâmetro que colidem uns com os outros.

No seu caso, em SaveToFile(...) você deve retornar E_INVLIADARG uma vez que não é válido para passar nome de arquivo vazio, e em GetAttributes(...) você deve retornar E_POINTER (se é um fora param) porque você não pode preencher o valor.

E sim, nós todos L-O-V-E com:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top