Возвращение VARIANT

Пишу реализацию COM-сервера. Один из методов должен возвращать VARIANT. В idl у меня такое объявление

HRESULT _stdcall Method([out, retval] VARIANT * res);

из него получается такой h файл

STDMETHOD(Method)(VARIANT * res);

Вопрос: как мне правильно возвратить результат? Должен ли я в методе вызвать VariantInit(res)? Или это делает вызывающая сторона? Если должен, то должен ли я предварительно вызвать VariantClear(res)? Или я всегда получаю указатель на неинициализированный VARIANT?

Или у меня должен быть такой код?

if (res->vt != VT_EMPTY)
    VariantClear(res);
VariantInit(res);

Этот VARIANT потом должен будет отмаршалиться в другой процесс.


Ответы (1 шт):

Автор решения: Anton Shchyrov

Указатель res не может содержать указатель на мусорную память, поэтому в функции мы вызываем VariantClear(res) который, при необходимости, очистит содержимое res (уменьшит счетчики ссылок) и установит vt = VT_EMPTY, а потом с этим указателем работаем как нам нужно.

Второй способ: работаем с классом ATL::CComVariant, а в конце вызываем метод Detach(res). Он тоже внутри вызовет VariantClear(res), скопирует в res структуру tagVARIANT и откажется от своих прав на нее

→ Ссылка