Сложность.

Есть варианты попроще и красивее?
Модератор: Модераторы
Если работала, значит, там были простые типы — типа varSingle, varLongWord (даже varString не должен работать)
Для них раскладка в памяти, скорее всего, осталась такой же, так что (возможно) сработает просто чтение в первые 16 байт 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;
ASomeStream.ReadBuffer(AVariantVar, 16);
Ichthyander писал(а): но вдруг это можно было сделать проще и элементарно. Но, видимо, нет.
если с обычными типами как то прокатить, то с о всякими указателями, объектными типами, массивами можно вполне словить эксепшен..Ichthyander писал(а):Тупо и смело считываем только первые 16 байтов
TMyVariant = record
ValueType: VType;
case VType of
vtInteger: (ValueI: Integer);
vtSingle: (ValueS: Single);
...
end;
Ichthyander писал(а):Вопрос. В потоке (TFileStream или TMemoryStream) размещена переменная тип Variant, записанная там из кода, скомпилированного в 32-битном режиме FPC. Как прочесть этот же блок памяти из под 64-битного кода FreePascal.
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15