Главная страница | назад





Article #17800: Record alignment in 32bit pascal.

 Question and Answer Database

FAQ2800D.txt   Record alignment in 32bit pascal.
Category   :Object Pascal
Platform    :All
Product    :All 32 bit  

Question:
When I try to call a function in a DLL and pass a record, the field
members are not aligned in the same way the dll expects. The DLL was
constructed with a C compiler using record member alignment. How can I
achieve a like record alignment with Delphi?


Answer:
The following example demonstrates padding a record to 32 bit
boundaries. Adjustments will need to be made to interface with the
compiler directives that were in place when the dll was built, as
there are differing rules that can be in force during compile time in
regards to record alignment. Some compilers may have options to
(for instance) guarantee that every field is not only 32 bit aligned,
but each field will also be located on an even 32 bit boundary. It may
even be possible that the given compiler guarantees that the entire
record is aligned to an even number of 32 bit "chunks".

type SomeAlignedRecord = {$IFDEF WIN32} packed {$ENDIF} record
       AByteField : byte;
      {add three bytes to align field to 32 bits}
       UnusedPaddingA : array[1..3] of byte;
       AWordField : word;
      {add two bytes to align field to 32 bits}
       UnusedPaddingB : array[1..2] of byte;
       ACharField : char;
      {add three bytes to align field to 32 bits}
       UnusedPaddingC : array[1..3] of byte;
      {align record to an even number of 32 bit chunks}
       FinalUnusedPadding : array[1..4] of byte;
     end;

7/16/98 4:31:28 PM
 

Last Modified: 01-SEP-99