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