0

我有一个[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(),还是复印一份?客户端是否会自动承担释放由字符串值属性返回的字符串的责任?

4

1 回答 1

1

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

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

于 2013-10-22T16:42:23.833 回答