Op Tue, 5 Feb 2008, schreef Marc Weustink:
Show quoted text 27 lines
Daniël Mantione wrote:
>
>
> Op Tue, 5 Feb 2008, schreef Luiz Americo Pereira Camara:
>
>> can i safely use the below object instead of the record and pass directly
>> to the c function?
>>
>> TMyObj = object
>> x: Integer;
>> y: Integer;
>> Method1;
>> Method2;
>> end;
>> PMyObj = ^TMyObj;
>
> Yes, objects (by specification) are defined to have the same binary layout
> as records.
>
>> Moreover, whats the difference between objects and records with methods
>> (the new Delphi feature)?
>
> Objects can have virtual methods, constructors, destructors. The new Delphi
> feature cannot.
however with virtuals or constructors/destructors, the memory layout is not
100% the same as a record.
A constructor doesn't add a vmtlink. A virtual method does, and a destructor too because they are virtual. It is never a problem in practise, because you can declare the virtual method in a descendent, i.e.:
type Tbinary_compatible_obj=object
a,b,c,d,e,f:byte;
constructor init;
end;
Tbinary_compatible_obj_with_vmt=object(Tbinary_compatible_record)
constructur init;
procedure virtualmethod;virtual;
desctructor done;virtual;
end;
In the above example, you can perfectly pass a
Tbinary_compatible_obj_with_vmt instance to any C library expecting a Tbinary_compatible_obj, because the vmtlink is located after the fields and therefore does not interfere with the binary structure.
Daniël