Windows 何时返回E_指针,何时E_失效?
COM接口方法可以返回各种Windows 何时返回E_指针,何时E_失效?,windows,com,pointers,com-interop,Windows,Com,Pointers,Com Interop,COM接口方法可以返回各种HRESULT值,以表示传递的参数值无效。何时返回E_指针以及何时返回E_无效标记 HRESULT CImpl::SaveToFile( WCHAR* fileName ) { if( fileName == 0 ) { return // what to return here? } //... do actual work here } HRESULT CImpl::GetAttributes( Attributes* to
HRESULT
值,以表示传递的参数值无效。何时返回E_指针
以及何时返回E_无效标记
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_INVALIDARG
。如果一个方法接收到一个接口**
指针,它将存储一个指向新创建的对象的指针,该对象是E_指针
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;
}
检查指针类型参数时,何时返回
E_指针
以及何时返回E_INVALIDARG
的规则是什么?当对out参数指针的引用为空时,返回E_指针
,这是一个错误代码,它指示程序或交互层中的错误。
当应用程序级别与参数(例如超出范围的问题或参数相互冲突)一起打开时,返回E_INVALIDARG
在您的例子中,在SaveToFile(…)
中,您应该返回E_INVLIADARG
,因为传递空文件名无效,而在GetAttributes(…)
中,您应该返回E_POINTER
(如果是out参数),因为您无法填充该值
是的,我们都是L-O-V-E公司:)你有任何文件证明吗?同意。我真的很想看到这方面的MSDN参考资料。上面这句话有点道理,但是如果有一个圣典的抗争,那就好了。我不确定这个答案是否正确。例如,在VS2010
中,在AtlSetChildSite()
实现中,如果punkChild
参数为NULL
,则返回E_指针
,而根据此答案(如果我理解正确),在这种情况下应该返回E_INVALIDARG
。我认为ATL是良好COM编程实践的良好来源,因此在无效(例如NULL
)指针的一般情况下,可能应该返回E_指针。但坦率地说,我也不确定,而且我同意一些MSDN官方参考会很好。为了增加混淆,在相同的
标题中,在CComPtr
专门化中,在PutProperty()
实现体中,如果pVar
(\u in_u-VARIANT*
)为NULL,则返回E指针
,但是如果p
(\In\uIdispatch*
中的\u)是NULL
,则返回E\u INVALIDARG
。我也在想,我在MSDN上能找到的最接近的答案是:。由于out-param/retval需要一个有效的指针来“返回”该值,因此在我看来,没有严格的COM规则,Shay是最正确的。