sha*_*oth 9 windows com pointers com-interop
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;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果它收到一个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;
}
Run Code Online (Sandbox Code Playgroud)
何时返回E_POINTER以及E_INVALIDARG何时检查指针类型参数的规则是什么?
Sha*_*men 11
返回E_POINTER时,引用到的指针出参数为空,这样认为是一个错误代码,指明在程序或在互操作层的错误.
如果E_INVALIDARG启用了应用程序级别,则返回参数,例如超出范围的问题或参数相互冲突.
在你的情况下,SaveToFile(...)你应该返回,E_INVLIADARG因为传递空文件名是无效的,并且GetAttributes(...)你应该返回E_POINTER(如果它是一个out param),因为你无法填充该值.
是的,我们都喜欢com :)
| 归档时间: |
|
| 查看次数: |
6876 次 |
| 最近记录: |