COM: вернуть копию строки или фактическое значение?

у меня есть [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()или копия из этого? Берут ли клиенты на себя ответственность за освобождение строки, возвращаемой строковым свойством?

0

Решение

Трудно сказать, это не совместимая с Automation подпись. Интерфейс IDispatch требует передачи строк в виде BSTR, строки, которая размещается в куче COM. Контракт для [out, retval] заключается в том, что метод интерфейса выделяет строку с помощью SysAllocString (), а вызывающая сторона освобождает ее с помощью SysFreeString ().

Ваш код в том виде, в котором он написан, вероятно, ведет себя неправильно. Вы должен по крайней мере, используйте SysAllocString, копию другими словами. Вы могли бы избежать использования декларации OLECHAR ** в вашей IDL, но это довольно вредно для здоровья, это может пойти не так, когда вызов ранний и маршалинг через границу квартиры. Вам лучше это исправить, используйте вместо этого BSTR *.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]