Правильное использование вариантов с VT_RECORD и VT_BYREFC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Правильное использование вариантов с VT_RECORD и VT_BYREF

Сообщение Anonymous »

Мне нужно лучше понять записи, хранящиеся в VARIANT.
Если существует вариант типа 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 является AddReffed
Поэтому при уничтожении варианта необходимо также освободить объект 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))
Что нужно делать с указателем IRecordInfo при выделении или освобождении записи BYREF?
Варианты BYREF обычно не меняют память при использовании их можно освободить без разыменования.
Но вот теперь у меня есть указатель на *IRecordInfo. Что делает VariantClear, когда освобождает вариант BYREF? Разыменовывает ли он объект IRecordInfo или нет?
Опыт приветствуется!

Подробнее здесь: https://stackoverflow.com/questions/785 ... d-vt-byref
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»