COM:返回字符串或实际值的副本?

时间:2013-10-22 16:31:41

标签: c++ windows com idl

我有[dual]接口实现IDispatch,如下所示:

[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 个答案:

答案 0 :(得分:1)

很难说,它不是兼容自动化的签名。 IDispatch接口需要将字符串作为BSTR传递,BSTR是在COM堆上分配的字符串。 [out,retval]的合同是interface方法使用SysAllocString()分配字符串,调用者使用SysFreeString()释放它。

您编写的代码可能行为不当。您必须至少使用SysAllocString,换句话说就是副本。你可能会在你的IDL中使用OLECHAR **声明,但这是非常不健康的,当这个呼叫是早期绑定并在整个公寓边界编组时会出错。你最好修好它,改用BSTR *。