Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ COM:返回字符串的副本,还是实际值?_C++_Windows_Com_Idl - Fatal编程技术网

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应该复制字符串内容,而不是指针,无论您希望以何种格式保存它。使用谷歌链接,亚马逊图书。