У меня есть проект DLL, который предоставляет определение типа с "вариантной частью" Delphi следующим образом:
type TValue = record
case Kind : cardinal of
valueShortCard : ( ValShortCard : byte );
valueLongReal : ( ValLongReal : double );
end;
Я ожидаю, что эта структура будет иметь размер 12 байтов (4Б для cardinal плюс 8B для double, поскольку это больший из этих двух типов).
Но если у меня есть приложение и я вызываю функцию sizeof () для структуры в DLL, в нем указано, что размер равен 16 байтам.
Кроме того, если я объявлю ту же структуру непосредственно в проекте приложения .exe, sizeof () вернет правильный размер, равный 12 байтам.
Если я запускаю приложение и пытаюсь получить значение ValLongReal из скомпилированной библиотеки DLL, возвращаемое значение неверно и кажется, что оно сдвинуто на 4 байта в памяти.
I.E. если «double» переменная в DLL содержит значение «40 45 9a e1 47 ae 14 7b» (интерпретируется в байтовых значениях), значение, возвращаемое приложением после чтения его из DLL, будет «47 ae 14 7b 77 07. 06 7д ". Это означает, что имеется 4 байта перекрытия правильных данных, а последние 4 байта неверны и считываются из следующего пространства в памяти.
Примечание. Такое поведение уже наблюдалось в Delphi XE4, мы только что обновились до XE5, но оно ведет себя точно так же. Используемая ОС - Win7 32-битная.
спасибо за ваши предложения