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

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

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

Ответить
Аватара пользователя
SlowPow
незнакомец
Сообщения: 4
Зарегистрирован: 27.09.2022 04:39:57

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

Сообщение SlowPow »

Приветствую.
Потребовалось мне внезапно делать снимки экрана, и обнаружилась странная проблема:
строка вида

Код: Выделить всё

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);
Alex2013
долгожитель
Сообщения: 3230
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

По моему это еще и от разрядности зависит ( в 32-х разрядной программе может проскочить "неправильный" вариант, а в 64-битной это уже не прокатит )
Последний раз редактировалось Alex2013 23.10.2022 21:07:38, всего редактировалось 1 раз.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

SlowPow писал(а):вызывает "RunError(201) with message Range check error". Ошибка не регулярна - можно спокойно скопировать кусок изображения несколько раз, после чего получить ошибку, но можно и при первом запуске обломаться.
"Нерегулярность" ошибки кроется в том, что функция может возвратить число (а DC - это число), которое в пределах 32 бита, а может возвратить и число, которое вне этих пределов. Так что лучше заранее полюбопытствовать, какой именно тип данных возвращает функция, чтобы не ловить такие "плавающие" ошибки. В данном случае тип "HDC", который возвращает функция, что-то вроде виртуального типа и будет зависеть от разрядности ОС. Поэтому лучше использовать именно его, а не какой-нибудь "реальный" тип, вроде "Integer" или "QWord"...
Ответить