当返回E_POINTER和E_INVALIDARG时?

时间:2009-09-15 11:47:13

标签: windows com pointers com-interop

COM接口方法可以返回各种HRESULT值,以表示传递的无效参数值。我何时返回E_POINTERE_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 个答案:

答案 0 :(得分:10)

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

当应用程序级别打开时,如果参数超出范围问题或参数相互冲突,则返回E_INVALIDARG

在您的情况下,在SaveToFile(...)中,您应该返回E_INVLIADARG,因为传递空文件名无效,而在GetAttributes(...)中您应该返回E_POINTER(如果是因为你无法填补这个价值。

是的,我们都是L-O-V-E com :)。