Когда вернуть E_POINTER и когда E_INVALIDARG?
-
07-07-2019 - |
Вопрос
Методы 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 *
с именем файла в виде " в " параметр, и этот 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
при проверке параметров типа указателя?
Решение
Вы возвращаете E_POINTER
, когда ссылка на указатель параметра out равна нулю, это считается кодом ошибки, указывающим на ошибку в программе или в промежуточный слой. Р>
Вы возвращаете E_INVALIDARG
, когда на уровне приложения включен параметр, например, из-за проблемы диапазона или параметр, который сталкивается друг с другом.
В вашем случае в SaveToFile (...)
вы должны вернуть E_INVLIADARG
, так как недопустимо передавать пустое имя файла, а в GetAttributes ( ...)
вы должны вернуть E_POINTER
(если это выходной параметр), потому что вы не можете заполнить значение. Р>
И да, мы все L-O-V-E com:)