C++ COM:返回字符串的副本,还是实际值?
我有一个C++ COM:返回字符串的副本,还是实际值?,c++,windows,com,idl,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 {
[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;
...
};
class CBackingObject:公共IMyInterface
{
标准::基本字符串d_str;
...
};
返回
StringValue
属性的COM约定是什么?我应该返回d_str.data()
,还是它的副本?客户端是否自动承担释放字符串值属性返回的字符串的责任?很难说,它不是与自动化兼容的签名。IDispatch接口需要将字符串作为BSTR传递,BSTR是在COM堆上分配的字符串。[out,retval]的约定是接口方法使用SysAllocString()分配字符串,调用方使用SysFreeString()释放字符串
您编写的代码可能会出现错误行为。您必须至少使用SysAllocString,换句话说,这是一个副本。您可以在IDL中使用OLECHAR**声明,但这是非常不健康的,当调用提前绑定并跨公寓边界编组时,就会出现错误。您最好修复它,改用BSTR*。谢谢Hans--回答得很好,我会根据合同进行相应的修复。三个问题:(1)我应该返回一个SysAllocString()的副本吗?(2) 如果我有相应的
propput
,我也应该复制传入的BSTR?(3) 你能将我链接到解释合同的文档吗?SysAllocString已经制作了副本。setter应该复制字符串内容,而不是指针,无论您希望以何种格式保存它。使用谷歌链接,亚马逊图书。