Сохранять Variant в Stream как есть - это плохо. И сама задача тому доказательство. Но вопрос задачи немного другой.
Добавлено спустя 1 минуту 53 секунды:Чуть не успел раньше Вас написать про то, что конечно же сохранять варианты в поток некрасиво. Я вообще думал, что написал об этом в первом посте топика. Но пропустил и тем самым суть дискуссии уводится не туда
Добавлено спустя 1 минуту 12 секунд:Если работала, значит, там были простые типы — типа varSingle, varLongWord (даже varString не должен работать)
Да, конечно, Вы правы. Там были только простые типы. Ни строк, ни массивов, ни указателей и объектов.
Добавлено спустя 1 минуту 17 секунд:Для них раскладка в памяти, скорее всего, осталась такой же, так что (возможно) сработает просто чтение в первые 16 байт Variant'а.
Интересно предположение, но вряд ли... В любом случае не очень нравится такое решение. Но! для такого случае может и нет красивого решения!
Добавлено спустя 19 минут 8 секунд:Решение, которое поможет это разбор внутренней структуры Variant, то есть
- Код: Выделить всё
tvardata = packed record
vtype : tvartype;
case integer of
0:(res1 : word;
case integer of
0:
(res2,res3 : word;
case word of
varsmallint : (vsmallint : smallint);
varinteger : (vinteger : longint);
{$ifndef FPUNONE}
varsingle : (vsingle : single);
vardouble : (vdouble : double);
vardate : (vdate : tdatetime);
{$endif}
varcurrency : (vcurrency : currency);
varolestr : (volestr : pwidechar);
vardispatch : (vdispatch : pointer);
varerror : (verror : hresult);
varboolean : (vboolean : wordbool);
varunknown : (vunknown : pointer);
// vardecimal : ( : );
varshortint : (vshortint : shortint);
varbyte : (vbyte : byte);
varword : (vword : word);
varlongword : (vlongword : dword);
varint64 : (vint64 : int64);
varqword : (vqword : qword);
varword64 : (vword64 : qword);
varstring : (vstring : pointer);
varany : (vany : pointer);
vararray : (varray : pvararray);
varbyref : (vpointer : pointer);
{$ifdef FPC_HASFIXED64BITVARIANT}
{ unused so far, only to fill up space }
varrecord : (vrecord : pointer;precinfo : pointer);
{$endif FPC_HASFIXED64BITVARIANT}
);
1:
(vlongs : array[0..2] of longint);
);
1:(vwords : array[0..6] of word);
2:(vbytes : array[0..13] of byte);
end;
Создать свой тип на основе этого, который бы не зависел от ключей компиляции и читать данные из stream прямо в него. Вообщем, я об это думал изначально, но вдруг это можно было сделать проще и элементарно. Но, видимо, нет. Что опять таки понять можно )
Добавлено спустя 35 минут 7 секунд:Короче, я реально ступил. Все просто оказалось. Интересно, что я это проверял, но в первый раз не получилось второпях это сделать правильно...
runewalsh, прав: значащие только первые 16 байтов.
Поэтому
Тупо и смело считываем только первые 16 байтов, то есть
ASomeStream.ReadBuffer(AVariantVar, 16);