Методы COM-интерфейсов могут возвращать различные значения HRESULT
, чтобы сигнализировать о переданных недопустимых значениях аргументов. Когда мне вернуть E_POINTER
и когда E_INVALIDARG
?
Как я понимаю, если метод получает индекс в инкапсулированной коллекции, и он выходит за пределы E_INVALIDARG
. Если метод получает указатель Interface**
, где он предназначен для хранения указателя на вновь созданный объект, это 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*
будет нулевым? Это E_POINTER
или E_INVALIDARG
?
Или метод получает указатель на некоторую структуру и, как ожидается, заполнит структуру через этот указатель, и этот указатель будет нулевым - это 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
при проверке параметров типа указателя?