===[ IT Happens жжот! ]=== #post-id: 4323-02-42 #original-date: 27.05.2012 Sun #original-time: 2:42 AM #original-day: 4323 #original-host: WinXP Home SP3 (Build 2600) > #9263: Яйца курицу не учат > > Вспомнил первый день работы в компании, где на всех рабочих местах > стояла Убунту. Я с линуксом на «ты», но с этим дистрибутивом ранее > работать не приходилось. > > Ставлю операторше скайп. Набираю apt-get install skype — ошибка. > Операторша пищит: > > — Это ж Убунту, тут sudo надо! > > На меня что-то нашло. Кричу не своим голосом: > > — Курица, я ж тебя краситься не учу! > > Год уже там работаю. Отношения со всем коллективом хорошие, кроме > угадайте кого. Удивительно! Чего это у них напряжённые отношения? Может быть она - тупая блондинка, которая настолько тупая что блрондинка? Или просто аффтар - мудак, которому стоит отучиться кричать чьими-то чужими голосами, вообще кричать, ну и снизить ЧСВ. Насколько я помню опыт установки программ в бубунте и Минте, единственной ошибкой было "Используйте sudo". Следующий аффтар тоже жжот, но малость тоньше. > #9251: Окна и велосипеды > > Большинство людей, когда им нечего делать, находят себе > какие-нибудь развлечения: кино посмотреть, музыку послушать или > в игры там поиграть. У меня же, как у программиста, свои «игры» > и «развлечения»: эмулятор DOS на КПК и мечта детства написать > гибридную программу, которая бы одинаково работала и под DOS, > и под Windows. Писал я её на ассемблере, долго и по чуть-чуть. > Но вот настал момент, когда программа была почти готова, > и осталось только написать простенький мини-драйвер под Windows, > который будет перенаправлять вывод программы в окно. > > Ну, скомпилил модуль. Запустил — программа падает с фатальной > ошибкой. Ничего страшного, я к этому уже привык. При написании > программ на асме иначе просто не бывает. Ошибка в одном бите — > и программа уже фатально падает. Но именно этот стиль написания > программ, привитый с детства, когда ты видишь программу насквозь > и чисто интуитивно чувствуешь, где кроются ошибки, очень помогает > в моём ремесле. > > Загружаю старый добрый TD32. И тут происходит это… Знаете, как > выглядит самый страшный ночной кошмар любого программиста? Самый > страшный кошмар программиста — это когда прога падает при простом > запуске, но при попытке отладить её ошибка мистическим образом > испаряется! При запуске под отладчиком программа преспокойно > работает. Я начинаю судорожно анализировать ситуацию: что такого > я мог накосячить, что прога отказывается работать под «голой» > виндой? > > На анализ ситуации уходит пара часов, в течение которых программа > дописывается до фактически окончательного состояния, но решить > проблему так и не удаётся — прога так и падает где-то в User32, > хоть ты тресни. И тогда я решаю пойти от обратного. Вот в соседней > папке лежит каркасное приложение под винду, которое прекрасно > работает. Чем же от него отличается моя программа? > > Оказывается, перед тем как приступить к написанию модуля, я на > всякий пожарный решил перечитать статьи по некоторым функциям API, > причём не где-то на левых сайтах, а непосредственно в MSDN. Там > я обнаружил весьма интересную информацию: оказывается, функция > регистрации класса окна возвращает идентификатор этого самого > класса, так называемый атом, который можно использовать вместо > имени класса при создании окна. Конечно, как ярый фанат > оптимизации (не зря же на асме пишу), я именно так и сделал. Зачем > заставлять ОС делать лишние телодвижения? Ведь она же всё равно > этот самый идентификатор будет искать по имени. Я это сделал > и преспокойно забыл. > > Вернул идентификацию класса окна по имени — всё заработало. Тут > всё встало на свои места. Оказывается, никакой магии в том, что > ошибка мистически пропадала в отладчике, нет. Эти самые атомы > работают только под Win95/98. > > А весь фокус с исчезновением в том, что древний TD32 работал > в режиме совместимости с Win95. Но ни в одной справке про это нет > ни единой строчки! Даже в официальном MSDN. Там прям так > и написано: можете использовать либо имя, либо идентификатор. > > Вот мне и вам урок на будущее: меньше доверяйте документации > Микрософта и не изобретайте велосипеды. Пишите так, как пишут все, > и будет вам счастье. Написано много букаф, из которых становится ясно, что шаблоны рулят, Ассемблер крут, а аффтар - бог программирования. Ну и что плохая MS опять напортачила в MSDN. Расчёт был прост: увидев слова "Ассемблер", "Гибридная" и "Мини-драйвер", читатели испугаются и проверять не будут. А я проверила, ибо история мне сразу показалась сомнительной. У меня как раз WinAMP Relay создаёт окно, которое эмулирует WinAMP API. Поскольку я пишу на VB6, а там нужен собственный класс, то создаётся это через RegisterClassEx()/CreateWindowEx(), благо что портированный пример Hello World из VC++ у меня был (лет десять назад развлекалась). Всё что мне потребовалось - объявить новую версию CreateWindowEx (Long вместо String) и использовать атом. С первой попытки VB начал вылетать, прямо как в истории. Вчиталась в документацию, сходила на сайт. Решила посмотреть, что там возвращается в качестве атома. Оказалось, что возвращается WORD, который в Integer получает минус - в VB нет беззнаковых типов. Потом при передаче в CreateWindowEx() это значение превращается в Long, единичка минуса уходит в верхний бит, и верхняя часть Long'а перестаёт быть нулевой как того требует функция. А раз там не нуль, значит это указатель на строку. Функция идёт по указателю, и процесс вылетает. Ага. Лёгким движением руки переводим знаковый Integer в беззнаковый, но уже в виде Long и передаём его функции. Функция видит, что там атом, подхватывает его и создаёт окно. Программа работает. Ящитаю, что юный бог Ассемблера совершил точно такую же ошибку, передал функции неверный указатель, и программа падала. Почему под отладчиком всё работало - я БП. Вероятно, что совместимость там не при чём.