当返回E_POINTER和E_INVALIDARG时?
-
07-07-2019 - |
题
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;
}
但是如果它收到一个文件名为“in”的 WCHAR *
缓冲区呢?参数和此 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
时有什么规则?
解决方案
当对 out 参数的指针的引用为null时,返回 E_POINTER
,这被认为是一个错误代码,表示程序中或程序中的错误互操作层。
当应用程序级别打开时,如果参数超出范围问题或参数相互冲突,则返回 E_INVALIDARG
。
在您的情况下,在 SaveToFile(...)
中,您应返回 E_INVLIADARG
,因为它无效传递空文件名,并且在 GetAttributes( ...)
你应该返回 E_POINTER
(如果它是一个out param),因为你无法填充该值。
是的,我们都是L-O-V-E com :)。
不隶属于 StackOverflow