Windows 何时返回E_指针,何时E_失效?

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

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 )
{
    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是最正确的。