у меня есть [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;
...
};
Что такое соглашение COM для возвращения StringValue
имущество? Должен ли я вернуться d_str.data()
или копия из этого? Берут ли клиенты на себя ответственность за освобождение строки, возвращаемой строковым свойством?
Трудно сказать, это не совместимая с Automation подпись. Интерфейс IDispatch требует передачи строк в виде BSTR, строки, которая размещается в куче COM. Контракт для [out, retval] заключается в том, что метод интерфейса выделяет строку с помощью SysAllocString (), а вызывающая сторона освобождает ее с помощью SysFreeString ().
Ваш код в том виде, в котором он написан, вероятно, ведет себя неправильно. Вы должен по крайней мере, используйте SysAllocString, копию другими словами. Вы могли бы избежать использования декларации OLECHAR ** в вашей IDL, но это довольно вредно для здоровья, это может пойти не так, когда вызов ранний и маршалинг через границу квартиры. Вам лучше это исправить, используйте вместо этого BSTR *.
Других решений пока нет …