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
有什么规则吗?
<atlcomcli.h>
中,在AtlSetChildSite()
实现中,如果punkChild
参数为NULL
,则返回E_POINTER
,而根据这个答案(如果我理解正确的话),应该返回E_INVALIDARG
。我认为ATL是良好COM编程实践的良好来源,因此在无效(例如NULL
)指针的一般情况下,可能应该返回E_POINTER
。但坦率地说,我也不确定,我同意一些MSDN官方参考资料会很好。 - Mr.C64<atlcomcli.h>
头文件中,在CComPtr<IDispatch>
特化中,在PutProperty()
实现体中,如果_In_ VARIANT*
的pVar
为NULL
,则返回E_POINTER
,但如果_In_ IDispatch*
的p
为NULL
,则返回E_INVALIDARG
。 - Mr.C64