当返回E_POINTER和E_INVALIDARG时?

sha*_*oth 9 windows com pointers com-interop

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;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果它收到一个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;
}
Run Code Online (Sandbox Code Playgroud)

何时返回E_POINTER以及E_INVALIDARG何时检查指针类型参数的规则是什么?

Sha*_*men 11

返回E_POINTER时,引用到的指针参数为空,这样认为是一个错误代码,指明在程序或在互操作层的错误.

如果E_INVALIDARG启用了应用程序级别,则返回参数,例如超出范围的问题或参数相互冲突.

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

是的,我们都喜欢com :)