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

Posted wainiwann

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于ATL接口返回类型&&ATL接口返回字符串BSTR*的主要内容,如果未能解决你的问题,请参考以下文章

使用 ATL 的参数类型

使用 ATL 编译 dll,将方法参数作为接口,但将它们作为 coclasses

将实现 ATL 接口的 VBA 类传递给 ATL 方法

将实现ATL接口的VBA类传递给ATL方法

Visual C++:接口的 ATL 实现

如何在基于 ATL 的服务器中正确转换和使用本机 COM 类型?