ATL接口返回类型&&ATL接口返回字符串BSTR*

感觉在ATL中做COM组件,添加方法的时候,其返回值只能是HRESULT,我想返回其他数据类型,可以吗?

非也非也 HRESULT指示返回的状态,即正确与否, 返回值是这样的 HRESULT MyMethod([in]int p1,[out,retval]int *pRetval); 在VB和脚本里就可以n=obj.MyMethod(123)

这是COM规范规定的,其他同上

COM规范并没有规定接口成员函数一定要返回HRESULT,可以返回其它类型的值,使用其它类型值时,组件没有远程能力,组件不能保证与其他组件正常通讯。但你使用了ATL,可能ATL在编译时会限制你的函数返回值类型。 这是我的理解,关于ATL我不清楚,以上观点如有错误,欢迎指正

同意楼上。想返回其他数据类型可以在参数中传递地址。

HRESULT除了反映正确与否,还可能是一个错误码,因为组件不能简单抛出C++异常,必须正确返回,以错误码和ISupportErrorInfo接口等对错误信息提供支持。 普通返回值做不到这一点儿。 对于VB等可以直接使用返回值的语言,只能用参数修饰的方法来做, [out, retval] type*

HRESULT只是返回了你组件的执行状况是否有异常,你可以根据HRESULT捕捉错误,你可以使用自己需要的数据类型,在参数中传递地址。

http://www.fx114.net/qa-215-39830.aspx

=============================================================

如何从COM接口返回字符串 

STDMETHODIMP CFun::Cat(BSTR s1, BSTR s2, BSTR *pVal) 

 CComBSTR sResult( s1 ); 
 sResult.AppendBSTR( s2 ); 

 *pVal = sResult.Copy(); 

 return S_OK; 
}

忘记说了上述方法的in-out类型如下:
HRESULT Cat([in]BSTR s1, [in]BSTR s2, [out,retval]BSTR* pVal);

一个函数中,可以有多个[in]、[out],但[retval]只能有一个,并且要和[out]组合后在最后一个位置。

------------------------------------------------------------------------------------------------------------------------------

http://bbs.csdn.net/topics/190110366

原文地址:https://www.cnblogs.com/wainiwann/p/7219189.html