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