Сложность.
 Variant в коде, скомпилированном в 32-битном FPC хранится в 16 байтах памяти. Variant 64-битный - 24 байтах
 Variant в коде, скомпилированном в 32-битном FPC хранится в 16 байтах памяти. Variant 64-битный - 24 байтахЕсть варианты попроще и красивее?
Модератор: Модераторы
 Variant в коде, скомпилированном в 32-битном FPC хранится в 16 байтах памяти. Variant 64-битный - 24 байтах
 Variant в коде, скомпилированном в 32-битном FPC хранится в 16 байтах памяти. Variant 64-битный - 24 байтах

Если работала, значит, там были простые типы — типа 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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1