При этом неизвестные классы загружаются как их известные предки.
Хмм... Правильно я понимаю что встречая имя неизвестного класса, система по этому имени находит ближайший известный предок?
А как это делается в общих чертах, если не секрет?
Модератор: Модераторы
При этом неизвестные классы загружаются как их известные предки.
но регистрация типов осуществляется парсеньем исходников программы
делаю подобную штуку.
Type converter "SINGLE" -> "BYTE,SHORTINT,SMALLINT,WORD,LONGINT,LONGWORD,INT64,QWORD": 0041329Ch
Type converter "SHORTINT,SMALLINT,LONGINT,INT64" -> "SINGLE": 004135D8h
Type converter "BYTE,WORD,LONGWORD,QWORD" -> "SINGLE": 00413850h
Type converter "DOUBLE" -> "BYTE,SHORTINT,SMALLINT,WORD,LONGINT,LONGWORD,INT64,QWORD": 00413380h
Type converter "EXTENDED" -> "BYTE,SHORTINT,SMALLINT,WORD,LONGINT,LONGWORD,INT64,QWORD": 004134A0h
.......
Class "TTESTDATANEXT": field "B:LONGINT": Converting from "SINGLE".
type TArrayOfByte = array of byte;
Procedure NewDynArray(parray: pointer; Len, BaseTypeInd: integer);
var
p: pointer;
begin
pointer(parray^):= nil;
SetLength(TArrayOfByte(parray^), Len * Types[BaseTypeInd].Size);
if Len > 0 then //high value in FreePascal, length in Delphi
{$ifdef fpc}
dword((pointer(parray^) - 4)^):= Len - 1;
{$else}
dword(pointer(cardinal(parray^) - 4)^):= Len;
{$endif}
end;
procedure ReadUnaligned(p: pointer; NumBytes: integer);
var
i: integer;
w: dword{$ifdef fpc} = 0{$endif};
begin
{$ifndef fpc}
w:=0;
{$endif}
i:= NumBytes div 4;
if i > 0 then begin
ReadBin(p, i); //оперирует 32-битными словами
Inc(cardinal(p), i * 4);
end;
i:=NumBytes - i*4;
if i > 0 then begin
ReadDword(@w);
move(w, p^, i);
end;
end;
procedure ReadUnaligned(p: pointer; NumBytes: integer);
var
i: integer;
w: dword{$ifdef fpc} = 0{$endif};
begin
{$ifndef fpc}
w:=0;
{$endif}
i:= 1 + ((NumBytes - 1) div 4);
if i > 0 then begin
ReadBin(p, i);
Inc(cardinal(p), i * 4);
end;
i:=NumBytes - i*4;
if i > 0 then begin
ReadDword(@w);
move(w, p^, i);
end;
end;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28