Как освободить элемент (например, BSTR, SAFEARRAY, VARIANT) определяемой пользователем структуры IDL, которая инкапсулирована в VARIANT?

У меня есть структура, определенная в IDL. Эта структура имеет следующие члены:


{
    BSTR m_sFirst;
    BSTR m_sSecond;
    VARIANT m_vChildStruct; //This member encapsulate a sub structure 
    SAFEARRAY __RPC_FAR * m_saArray;
}CustomINFO;

Я выделяю память для структур с помощью CoTaskMemAlloc и инкапсулирую ее в Variant следующим образом:



vV->vt = VT_RECORD;
vV->pvRecord = pStruct; //Pointer of sturct
vV->pRecInfo = pRI; //RecordInfo Interface

Достаточно ли вызвать VariantClear, чтобы освободить память структуры и ее элементов? Будет ли также выпущен интерфейс IRecordInfo?

Или мне нужно вручную получить инкапсулированную структуру и самостоятельно освободить каждый элемент, а затем использовать CoTaskMemFree для освобождения структуры.

Спасибо

Пикаро Де Восио


person Picaro De Vosio    schedule 18.04.2010    source источник
comment
Вам уже нужен IRecordInfo для основной структуры. Почему бы просто не объявить дочернюю структуру как есть вместо использования варианта?   -  person Hans Passant    schedule 18.04.2010


Ответы (1)


VariantClear вызовет IRecordInfo::Clear, который освобождает память, удерживаемую членами структуры, но предположительно не освобождает саму структуру (поэтому вы не можете правильно вернуть структуру в [out] VARIANT). IRecordInfo также должен быть выпущен.

(«следует» означает «иначе большая часть существующего кода будет сломана/сломается»).

Дополнительная информация здесь: http://vcfaq.mvps.org/com/4.htm

person peterchen    schedule 18.04.2010