2013-10-22 64 views
0

我有一個[dual]接口實現IDispatch,這樣的事情:COM:返回字符串或實際值的副本?

[dual, ...] 
interface IMyInterface : IDispatch 
{ 
    [id(1), propget] HRESULT StringValue([out, string, retval] OLECHAR const ** str); 
}; 

我對IMyInterface後盾對象有一個成員變量,d_str

class CBackingObject : public IMyInterface 
{ 
    std::basic_string<OLECHAR> d_str; 
    ... 
}; 

什麼返回StringValue財產COM約定?我應該返回d_str.data(),還是拷貝呢?客戶端是否自動承擔釋放由字符串值屬性返回的字符串的責任?

回答

1

很難說,它不是自動化兼容簽名。一個IDispatch接口需要傳遞字符串作爲BSTR,這是一個在COM堆上分配的字符串。 [out,retval]的契約是接口方法使用SysAllocString()分配字符串,調用者使用SysFreeString()釋放它。

您寫的代碼很可能會行事不端。你必須至少使用SysAllocString,換句話說就是副本。您可能會在您的IDL中脫離OLECHAR **聲明,但這種聲明相當不健康,當呼叫被早期綁定並跨過公寓邊界進行編組時,這種情況就會出現錯誤。你最好修復它,改用BSTR *。

+0

感謝漢斯 - 很好的答案,我會根據合同進行修改。三個問題:(1)我應該返回一個*副本*,即SysAllocString()'d? (2)如果我有相應的'propput',我應該複製傳入的BSTR呢? (3)您能否將我鏈接到解釋合同的文檔? – 0xbe5077ed

+0

SysAllocString已經使副本。設置者應該複製字符串內容,而不是指針,無論您想要保留哪種格式。使用谷歌鏈接,亞馬遜書籍。 –

相關問題