May 25th, 2020

Даты круглые и не совсем круглые

Смотрим на календарь, а там 25 мая...

1931 год. Родился Георгий Гречко, советский космонавт, дважды Герой Советского Союза.
1948 год. Родился Клаус Майне (Klaus Meine), вокалист немецкой группы "Scorpions".
1953 год. Первый полет самолета F-100 Супер Сейбр (Super Sabre).
1995 год. Первый полет самолета МиГ-21-93, глубокой модификации самолета МиГ-21.

Errare humanum est

Вспомнил еще одну свою эпическую ошибку. Было это лет 20 назад. В те времена я программировал на VB 6.0. Надо сказать, что Visual Basic не поддерживает работу с указателями. То есть вы можете работать с указателем как с обычным целым числом, но арифметику указателей, вычисление указателя на переменную или функцию и прочие удобные возможности не поддерживаются. Хотя все это можно сделать при помощи ряда хитростей и недокументированных функций. При необходимости. В принципе можно прекрасно программировать на VB и не использовать указатели вовсе. Даже и при работе с API функциями Windows можно обойтись хитрыми способами объявления этих функций вместо непосредственного использования указателей. Но если "лезть в молекулы", то рано или поздно придется столкнуться с необходимостью использования указателей. Все это решаемо. Когда мне это таки понадобилось, разобрался я достаточно быстро и проблем не испытывал. Но в один хороший момент я напоролся на прямо-таки непреодолимую проблему.

Мне понадобилось получить информацию о свойствах принтера - типы форматов, размеры полей и так далее. Эта информация записывалась в некую структуру, получить которую можно было через описатель. Описатель - это хитрая разновидность указателя, хранящая свойства различных объектов Windows. По сути это скорее даже не указатель на область памяти, а нечто вроде идентификатора. Непосредственно использовать описатель нельзя, его нужно получить при создании (или копировании) объекта и передавать в другие функции API для выполнения каких-либо действий с объектом. Хитрость описателя идентифицирующего свойства принтера заключалась в том, что функции, которая принимала бы в качестве аргумента описатель, а в качестве результата возвращала свойства принтера не было. Именно по этой причине я почему-то решил, что для получения свойств принтера необходимо просто скопировать блок данных на который указывает описатель в структуру, содержащую свойства принтера. Естественно, что у меня ничего не получилось - в структуру писалось все что угодно, кроме нужной информации. Это в лучшем случае, во всех остальных программа просто валилась. Когда я впервые столкнулся с этой проблемой, то я необходимую на тот момент информацию о принтере получил другим способом. Но периодически возвращался к данной проблеме. С нулевым понятное дело успехом.

Лет через несколько при очередной попытке решить проблему до меня наконец-то дошло! Это же описатель! Какого рожна я пытаюсь работать с ним как с указателем? Вопрос был решен минут за пять при помощи функции LocalLock, последующего копирования нужных данных по полученному указателю и так далее. И всех то делов! А надо было сразу пользоваться описателем как описателем.

Волгоград 2019. Часть 14.

Путешествие к Мамаеву кургану.

1. Совершенно неожиданно, но это здание Волгоградского областного суда. Впрочем ранее здесь был и театр эстрады и филармония. Провода -зло!

Collapse )
Продолжение следует...