Если существует вариант типа VT_RECORD, он имеет следующую структуру (в 32-разрядной версии):
Код: Выделить всё
V->vt = VT_RECORD
V->DATA1 //(8 byte offset) memory pointer to record's data (*void)
V->DATA2 //(12 byte offset) pointer to IRecordInfo interface (*IRecordInfo)
Поэтому при уничтожении варианта необходимо также освободить объект IRecordInfo.
А в случае варианта BYREF?
В этом случае вариант строится следующим образом:
Код: Выделить всё
V->vt = VT_RECORD | VT_BYREF
V->DATA1 // -> pointer to a pointer of record's data (**void)
V->DATA2 //-> pointer to IRecordInfo interface (here experienced it is not (**IRecordInfo) but (*IRecordInfo))
Варианты BYREF обычно не меняют память при использовании их можно освободить без разыменования.
Но вот теперь у меня есть указатель на *IRecordInfo. Что делает VariantClear, когда освобождает вариант BYREF? Разыменовывает ли он объект IRecordInfo или нет?
Опыт приветствуется!
Подробнее здесь: https://stackoverflow.com/questions/785 ... d-vt-byref
Мобильная версия