Путевской Виктор (vipernn) wrote,
Путевской Виктор
vipernn

Category:

Errare humanum est

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

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

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

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 1 comment