Quando a devolução E_POINTER e quando E_INVALIDARG?
-
07-07-2019 - |
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?
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:)