1. 程式人生 > >ATL接口返回類型&&ATL接口返回字符串BSTR*

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

ext clas ror str std 理解 content 簡單 x11

感覺在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*