Вопрос

Методы 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:)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top