gpt4 book ai didi

windows - 什么时候返回 E_POINTER 什么时候返回 E_INVALIDARG?

转载 作者:可可西里 更新时间:2023-11-01 12:43:20 25 4
gpt4 key购买 nike

COM 接口(interface)方法可以返回各种 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有什么规则?

最佳答案

当对 out 参数指针的引用为空时,您返回 E_POINTER,这被认为是一个错误代码,表明程序或程序中存在错误互操作层。

当应用程序级别出现参数超出范围问题或参数相互冲突时,您将返回 E_INVALIDARG

在你的例子中,在 SaveToFile(...) 中你应该返回 E_INVALIDARG 因为传递空文件名是无效的,在 GetAttributes( ...) 您应该返回 E_POINTER(如果它是一个输出参数),因为您无法填充该值。

是的,我们都是 L-O-V-E com :)

关于windows - 什么时候返回 E_POINTER 什么时候返回 E_INVALIDARG?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1426672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com