Моя любимая прога =)

Персональный блог одноименного форумчанина. Человека и парохода, не побоюсь этого сравнения :)

Модератор: tyomitch

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Моя любимая прога =)

Сообщение tyomitch » 15.06.2006 (Чт) 13:42

До сих пор Tiger2 остаётся моим поводом для гордости, надеюсь -- справедливым.

Эта программа писалась год назад, для зачёта не помню по чему.
Задание было "реализовать какую-нибудь хеш-функцию на ассемблере под Windows".
Однако собственно хеш-функция составляет лишь крохотную часть того, что получилось -- это при том, что таких непременно важных фич, как поддержка стилей XP, разукрашенные меню и аляповатые контролы, там нет.
Теперь буду расписывать, что же в этой проге такого замечательного и расчудесного :-)

В отличие от маркетроидного напыщенного перечисления фич, встречающегося в форуме "Наши проекты", я про каждую собираюсь рассказать, как она реализована, и почему именно так. Надеюсь, кто-нибудь почерпнёт для себя какие-нибудь полезные моменты :-)


* прога одновременно консольная и гуёвая. Сам ехе-шник помечен как консольный, чтобы для неё создавались стандартные хендлы; но никто не запрещает консольной проге закрыть консоль, создать окно, и ничем не выдавать свою консольность.

Если прогу запустить без параметров, то она возьмёт своё имя из argv[0] и создаст новый процесс, который угадает, что нужно показывать окно. Сразу показывать окно нельзя -- если консольная прога запущена из cmd.exe, то он будет ждать её завершения; а нам надо вести себя как обычная гуёвая прога. Поскольку при создании этого дочернего процесса ему стандартные хэндлы не передаются, то ему даже не придётся их закрывать.

Здесь, кстати, есть тонкость: если в argv[0] мусор (а он там, оказывается, может быть), то вместо дочернего процесса запустится не пойми что. Стоило, конечно, использовать GetModuleFileName(0), ну да ладно, не править же год спустя :-)


* пара организационных замечаний -- в тестовых целях к проге приложена куча (650 штук) официальных тестов, а в саму прогу встроен измеритель скорости работы. Поэтому можно меряться с другими реализациями того же хеша.

Измеритель -- отдельная фишка. Он работает и в консольном, и в оконном режиме, причём включается переменной окружения TIGER2_PROFILE. Такой обходной путь я выбрал затем, чтобы единообразно обрабатывать все опции командной строки -- они все без исключения считаются входными файлами. (Да, за один раз можно передать и обработать хоть все 650 тестов, лишь бы все их имена поместились в командную строку. cmd.exe такого не позволит, а вот CreateProcess -- легко.)


* ещё пара специфичных для ассемблера моментов -- как парсить командную строку, и как форматировать сообщения в стиле sprintf(3). Взякие васмовцы с их дзеном соревнуются, у кого для этого код изящнее -- но зачем париться самому, если есть готовые API CommandLineToArgvW и FormatMessage? Последняя, кстати, умеет читать шаблоны из ресурсов и подставлять нужный для конкретной локали. У меня эта возможность никак не используется, но в свете предыдущего поста, про проблемы интернационализации, о ней хочется упомянуть.


В следующий раз обязательно продолжу расхваливать эту прогу. У меня в записках уже отмечено 6 новых поводов её похвалить; на пару постов должно хватить :mrgreen:
Изображение

Вернуться в Tyomitch

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList  
cron