Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Переход на 64 бита и SweetDrawing


Автор: Teemu 12.9.2022, 16:07
Приветствую. В процессе портирования одного приложения под 64 бита возникла пара багов которые из-за недостатка скиллов не могу раскопать)

Установлена Delphi 11.1. Приложение использует старую, древнюю библиотеку https://github.com/ocdogan/SweetDrawingEngine

На 32 битной версии приложение работает отлично, но в 64 битной ловится интересный баг в этом месте:

Код

class function TSCDeUtils.Round(D: Double): Int64; //Можно поменять на Integer, результат тот же
var
  F: Double;
begin
  F := Frac(D);
  Result := Floor(D); //Баг возникает тут, обращаемся к функции Floor из стандартного системного модуля System.Math
  if Abs(F) >= 0.5 then Inc(Result);
end;


Код этой функции из системного модуля:

Код

function Floor(const X: Double): Integer;
begin  // Вот тут при дебаге возникает ошибка -> Project raised exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'.
  Result := Integer(Trunc(X));
  if Frac(X) < 0 then
    Dec(Result);
end;


В переменную X функции Floor приходит значение 36, breakpoint стоит на Begin, жму F8 и получаю описанную ошибку: "Project raised exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION". Собственно, хотелось бы понять что именно не так. Объектов тут нет, модули стандартные. 

Если вытащить функцию Floor из модуля System.Math и закинуть в модуль откуда эту функция вызывается, допустим, вот так, то проблема отпадает. 

Код

class function TSCDeUtils.Floor2(const X: Double): Integer;
begin
  Result := Integer(Trunc(X));
  if Frac(X) < 0 then
    Dec(Result);
end;

class function TSCDeUtils.Round(D: Double): Int64;
var
  F: Double;
begin
  F := Frac(D);
  Result := Floor2(D);
  if Abs(F) >= 0.5 then Inc(Result);
end;


Дальше при определенных манипуляциях приложение всё равно крашится при обращении к c:/windows/system32/gdi32full.dll

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)