Windows.GetDC вызывает ошибку

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Windows.GetDC вызывает ошибку

Сообщение SlowPow » 27.09.2022 05:56:15

Приветствую.
Потребовалось мне внезапно делать снимки экрана, и обнаружилась странная проблема:
строка вида
Код: Выделить всё
a := Windows.GetDC(любой_HWD);
вызывает "RunError(201) with message Range check error". Ошибка не регулярна - можно спокойно скопировать кусок изображения несколько раз, после чего получить ошибку, но можно и при первом запуске обломаться.
Я даже обновил, а потом и переустановил Lazarus. Не помогает. Подскажите, куда копать ?

Добавлено спустя 23 часа 34 минуты 28 секунд:
Проблема решена:
64-разрядная функция GetDC возвращает QWord, так что при конвертации к менее емкому типу LongWord совершенно спокойно может возникнуть ошибка. А я втупил и писал
Код: Выделить всё
var a: Cardinal;
a := Windows.GetDC(0);

правильно делать так:
Код: Выделить всё
var a: HDC;
a := Windows.GetDC(0);
Аватара пользователя
SlowPow
незнакомец
 
Сообщения: 4
Зарегистрирован: 27.09.2022 05:39:57

Re: Windows.GetDC вызывает ошибку

Сообщение Alex2013 » 23.10.2022 18:35:23

По моему это еще и от разрядности зависит ( в 32-х разрядной программе может проскочить "неправильный" вариант, а в 64-битной это уже не прокатит )
Последний раз редактировалось Alex2013 23.10.2022 22:07:38, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 3049
Зарегистрирован: 03.04.2013 11:59:44

Re: Windows.GetDC вызывает ошибку

Сообщение Vadim » 23.10.2022 19:30:34

SlowPow писал(а):вызывает "RunError(201) with message Range check error". Ошибка не регулярна - можно спокойно скопировать кусок изображения несколько раз, после чего получить ошибку, но можно и при первом запуске обломаться.

"Нерегулярность" ошибки кроется в том, что функция может возвратить число (а DC - это число), которое в пределах 32 бита, а может возвратить и число, которое вне этих пределов. Так что лучше заранее полюбопытствовать, какой именно тип данных возвращает функция, чтобы не ловить такие "плавающие" ошибки. В данном случае тип "HDC", который возвращает функция, что-то вроде виртуального типа и будет зависеть от разрядности ОС. Поэтому лучше использовать именно его, а не какой-нибудь "реальный" тип, вроде "Integer" или "QWord"...
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 29

Рейтинг@Mail.ru