我有[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()
还是副本吗?客户端是否自动承担释放字符串值属性返回的字符串的责任?
答案 0 :(得分:1)
很难说,它不是兼容自动化的签名。 IDispatch接口需要将字符串作为BSTR传递,BSTR是在COM堆上分配的字符串。 [out,retval]的合同是interface方法使用SysAllocString()分配字符串,调用者使用SysFreeString()释放它。
您编写的代码可能行为不当。您必须至少使用SysAllocString,换句话说就是副本。你可能会在你的IDL中使用OLECHAR **声明,但这是非常不健康的,当这个呼叫是早期绑定并在整个公寓边界编组时会出错。你最好修好它,改用BSTR *。