Когда вернуть E_POINTER и когда E_INVALIDARG? - PullRequest
9 голосов
/ 15 сентября 2009

Методы 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 при проверке параметров типа указателя?

1 Ответ

10 голосов
/ 15 сентября 2009

Вы возвращаете E_POINTER, когда ссылка на указатель параметра out равна нулю, это считается кодом ошибки, который указывает на ошибку в программе или на уровне взаимодействия.

Вы возвращаете E_INVALIDARG, когда уровень приложения включен с параметром, например, вне диапазона, или параметром, который сталкивается друг с другом.

В вашем случае, в SaveToFile(...) вы должны вернуть E_INVLIADARG, так как нельзя указывать пустое имя файла, а в GetAttributes(...) вы должны вернуть E_POINTER (если это выходной параметр), потому что вы не можете заполнить Значение.

И да, мы все L-O-V-E com:)

...