10

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何时检查指针类型参数的规则是什么?

4

1 回答 1

12

当对outE_POINTER参数的指针的引用为 null 时返回,这被认为是一个错误代码,表明程序或互操作层中的错误。

当应用程序级别使用参数时返回E_INVALIDARG,例如超出范围的问题或相互冲突的参数。

在您的情况下,SaveToFile(...)您应该返回E_INVLIADARG,因为传递空文件名是无效的,并且GetAttributes(...)您应该返回E_POINTER(如果它是一个输出参数),因为您无法填充该值。

是的,我们都喜欢 com :)

于 2009-09-15T12:27:14.277 回答