Возвращение 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 шт):
Указатель res не может содержать указатель на мусорную память, поэтому в функции мы вызываем VariantClear(res) который, при необходимости, очистит содержимое res (уменьшит счетчики ссылок) и установит vt = VT_EMPTY, а потом с этим указателем работаем как нам нужно.
Второй способ: работаем с классом ATL::CComVariant, а в конце вызываем метод Detach(res). Он тоже внутри вызовет VariantClear(res), скопирует в res структуру tagVARIANT и откажется от своих прав на нее