Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Исправление ошибки "Range check error" в Delphi при использовании EM_LINEINDEX в 64-битном приложении

Delphi , Синтаксис , Типы и Переменные

 

Введение

В процессе разработки 64-битных приложений на Delphi разработчики могут столкнуться с ошибками проверки диапазона (Range check error), особенно при работе с Windows API. В данной статье мы рассмотрим конкретную проблему, возникающую при использовании сообщения EM_LINEINDEX, и предложим несколько решений.

Описание проблемы

Как сообщил пользователь Ian Branch, в 64-битном приложении на Delphi 12.3 возникает следующая ошибка:

Range check error at (0000000001B5E842{DBiWorkflow.exe}) [00000000027FE842] ad3WinAPIParser.TWinAPIControlParser.GetSelectionScreenPosition (Line 510, "ad3WinAPIParser.pas") + $44.

Ошибка происходит на строке:

NextLinePos := SendMessage(FHandle, EM_LINEINDEX, FY + 1, 0);

Где FY объявлен как LongInt (32-битное знаковое целое).

Анализ проблемы

Типы параметров SendMessage

Основная причина ошибки кроется в несоответствии типов данных:

  1. В 64-битном Windows:
  2. WPARAM определен как UINT_PTR (беззнаковое 64-битное целое)
  3. В Delphi это соответствует NativeUInt

  4. Переменная FY объявлена как LongInt (32-битное знаковое целое)

При передаче 32-битного значения в параметр, ожидающий 64-битное значение, может происходить некорректное преобразование типов, особенно при определенных значениях FY.

Особенности EM_LINEINDEX

Сообщение EM_LINEINDEX возвращает индекс символа для указанной строки в многострочном edit-контроле. Важно отметить, что оно может возвращать -1, если указанная строка не существует.

Решения проблемы

1. Явное приведение типов

Самый простой способ исправить ошибку - явно привести тип параметра:

NextLinePos := SendMessage(FHandle, EM_LINEINDEX, NativeUInt(FY + 1), 0);

Это гарантирует, что параметр будет передан в правильном формате.

2. Изменение типа переменной FY

Как предложил DelphiUdIT, можно изменить тип FY на 64-битный:

var
  FY: NativeInt; // или NativeUInt

Однако, как отметил автор, это может потребовать изменений в нескольких модулях.

3. Проверка граничных значений

Добавьте проверку на допустимые значения перед вызовом SendMessage:

if (FY >= 0) and (FY < MaxInt - 1) then
  NextLinePos := SendMessage(FHandle, EM_LINEINDEX, NativeUInt(FY + 1), 0)
else
  NextLinePos := -1; // или другая обработка ошибки

4. Логирование значений

Как предложил PeaShooter_OMO, добавьте логирование для анализа проблемы:

procedure TWinAPIControlParser.GetSelectionScreenPosition;
begin
  try
    NextLinePos := SendMessage(FHandle, EM_LINEINDEX, NativeUInt(FY + 1), 0);
  except
    on E: Exception do
    begin
      Log('Error in GetSelectionScreenPosition. FY=' + IntToStr(FY) + 
          ', Error: ' + E.Message);
      raise;
    end;
  end;
end;

Альтернативное решение

Вместо прямого вызова SendMessage можно использовать обертку с проверкой типов:

function SafeSendMessage(hWnd: HWND; Msg: UINT; wParam: NativeUInt; lParam: NativeInt): LRESULT;
begin
  Result := SendMessage(hWnd, Msg, wParam, lParam);
end;

// Использование:
NextLinePos := SafeSendMessage(FHandle, EM_LINEINDEX, FY + 1, 0);

Рекомендации по работе с Windows API в 64-битных приложениях

  1. Всегда проверяйте типы параметров Windows API функций
  2. Используйте NativeInt/NativeUInt для параметров, которые могут быть разного размера в 32- и 64-битных системах
  3. Добавляйте проверки граничных значений
  4. Реализуйте механизмы логирования для отладки проблем

Заключение

Ошибка "Range check error" в данном случае вызвана несоответствием типов данных при передаче параметров в Windows API функцию. Решение заключается в правильном приведении типов или изменении типа переменной. Для надежной работы 64-битных приложений важно учитывать различия в размерах типов данных между 32- и 64-битными системами.

Приведенные в статье решения помогут не только исправить конкретную проблему с EM_LINEINDEX, но и избежать подобных ошибок при работе с другими Windows API функциями.

Создано по материалам из источника по ссылке.

Исправление ошибки "Range check error" в Delphi при использовании EM_LINEINDEX в 64-битном приложении связано с несоответствием типов данных и требует явного приведения типов или изменения типа переменной.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Типы и Переменные ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-04 06:19:23/0.0057919025421143/0