【问题标题】:COM: Return copy of string, or actual value?COM:返回字符串的副本,还是实际值?
【发布时间】:2013-10-31 15:40:23
【问题描述】:

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

[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(),还是它的副本?客户端是否会自动承担释放字符串值属性返回的字符串的责任?

【问题讨论】:

    标签: c++ windows com idl


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢汉斯 - 很好的答案,我会相应地修复以遵守合同。三个问题: (1) 我应该返回一个 SysAllocString() 的 copy 吗? (2)如果我有对应的propput,我也应该复制传入的BSTR? (3) 你能把我链接到解释合同的文档吗?
    • SysAllocString 已经制作了副本。 setter 应该复制字符串内容,而不是指针,无论您想保留什么格式。使用 google 获取链接,使用 amazon 获取书籍。
    猜你喜欢
    • 2011-07-19
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2018-01-19
    • 2012-10-03
    • 1970-01-01
    相关资源
    最近更新 更多