Как освободить член (то есть BSTR, SAFEARRAY, VARIANT) от IDL-структуры, определяемой пользователем, которая инкапсулирована в VARIANT? - PullRequest
0 голосов
/ 18 апреля 2010

У меня есть структура, определенная в 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 для освобождения объекта.

Спасибо

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

1 Ответ

1 голос
/ 18 апреля 2010

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

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

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

...