ЕМ>Речь вовсе не о том, какая тулза что выводит. Речь о том, что есть немалое количество программ, которым требуются символьные идентификаторы оконных сообщений — хоть для показа в окошке, как отладчику, хоть для вывода в лог, как любой мало-мальски сложной оконной программе на этапе отладки. Вынесение регулярно используемых компонент в стандартные общие модули давно стало нормальной практикой. Например, какой процент всех программ использует dbghelp.dll? Очень небольшой, однако эта DLL включена в стандартную поставку.
dbghelp включена в поставку думаю исключительно благодаря тому, что в ней есть miniDumpWriteDump, которой пользуются многие (наши — так ваще все) программы да и сама винда. Причем _любые_ программы, а не те, таргет аудиотрией которых являются программеры. Тогда логично было бы возмущаться почему с виндой не ставиться windbg (кстати и правда, очень жаль что не ставиться, постоянно приходится ставить если надо анализировать проблему вживую)
ЕМ>Почему Вас так удивляет мой вопрос о том, нет ли в одной из таких DLL таблицы имен сообщений?
Прежде всего потому, что это не надо для пользовательских/административных приложений.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>Женя, ты понять меня не хочешь! Нет вообще этих #define в Windows! Ну #define они, и все, за пределами C/C++ не существуют.
ЕМ>Да ну? Что ж они тогда и в ассемблерных, и в паскальных, и бейсиковых, и фортрановских программах одни и те же? Не иначе, мистика.
Женя, у тебя перед Новым годом какой-то глюк
Ну числа это, числа, константы то есть. Вот придет мне в голову блажь, забуду я вообще про этот #include <windows.h> и начну писать так
switch(message)
{
case 0x201:
...
case 0x202:
...
}
И все. И нет никакого WM_LBUTTONDOWN. А сообщение с номером 0x201 — точно, есть. Номер у него 201, а больше ничего и нет.
А то, что имя в С-шном #define, Pascal const или не знаю где там в Фортране одно и то же — что тут удивительного? Вот сядем мы с тобой и напишем 2 программы, и в них обеих окажется, что для размера экрана используется имя ScreenSize. Не иначе, мистика
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Женя, у тебя перед Новым годом какой-то глюк PD>Ну числа это, числа, константы то есть. Вот придет мне в голову блажь, забуду я вообще про этот #include <windows.h> и начну писать так
Это у тебя, Паша, приступ излишнего теоретизма. Это называется "имена сообщений, определенные в системе". Понимаешь — в системе, а не в C, C++ или бейсике. Вот идентификатор errno в ОС Windows не определен, ибо не имеет к ней никакого отношения — он определен только в CRT. А идентификатор NIL определен в паскале и модуле, и неизвестен в стандартных реализациях C/C++. А какой-нибудь WM_INITDIALOG в любой системе программирования, реализованной под виндой, будет определен одинаково. Догадаешься, почему?
Здравствуйте, Евгений Музыченко, Вы писали:
PD>>Ну числа это, числа, константы то есть. Вот придет мне в голову блажь, забуду я вообще про этот #include <windows.h> и начну писать так
ЕМ>Это у тебя, Паша, приступ излишнего теоретизма. Это называется "имена сообщений, определенные в системе". Понимаешь — в системе, а не в C, C++ или бейсике. Вот идентификатор errno в ОС Windows не определен, ибо не имеет к ней никакого отношения — он определен только в CRT. А идентификатор NIL определен в паскале и модуле, и неизвестен в стандартных реализациях C/C++.
В системе, Женя, определены сообщения с номерами 0x201, 0x202 и т.д..
Есть сообщение, его номер uMessage, тип переменной UINT, а еще к нему поставляются wParam и lParam соответствующих типов.
А имени никакого нет.
>А какой-нибудь WM_INITDIALOG в любой системе программирования, реализованной под виндой, будет определен одинаково. Догадаешься, почему?
Не-а
Делаем по шагам.
1. Создаем в VS новый Win32 проект. В нем будет диалоговая функция для диалога About
2. Перед этой функцией пишем
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>В системе, Женя, определены сообщения с номерами 0x201, 0x202 и т.д..
Е-мое, Паша, ты совсем стареешь, что ли? Возьми документацию на винду — не на "язык программирования C, C++, Fortran или Basic", а на саму систему — хоть Win 1.0, хоть Win32. Почему в описании сообщения WM_INITDIALOG это имя приведено, а код — нет? Написали бы с самого начала: "сообщение с кодом hex(110) посылается при инициализации диалогового окна", и так далее. Но почему-то так не сделали. Почему, как думаешь?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Е-мое, Паша, ты совсем стареешь, что ли?
Старею, конечно. Но еще не совсем. А ты что, молодеешь ?
>Возьми документацию на винду — не на "язык программирования C, C++, Fortran или Basic", а на саму систему — хоть Win 1.0, хоть Win32. Почему в описании сообщения WM_INITDIALOG это имя приведено, а код — нет? Написали бы с самого начала: "сообщение с кодом hex(110) посылается при инициализации диалогового окна", и так далее. Но почему-то так не сделали. Почему, как думаешь?
И еще раз объясняю — нет такого имени. Ты язык-то все же вспомни. #define — это только имя времени препроцессирования, за пределами препроцессирования его нет.
А в документации да, приводятся имена из #define просто потому, что так удобнее, чем приводить номера. Но из этого вовсе не следует, что имя WM_INITDIALOG внутри Windows где-то существует.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>И еще раз объясняю — нет такого имени. Ты язык-то все же вспомни. #define — это только имя времени препроцессирования, за пределами препроцессирования его нет. PD>А в документации да, приводятся имена из #define просто потому, что так удобнее, чем приводить номера. Но из этого вовсе не следует, что имя WM_INITDIALOG внутри Windows где-то существует.
Ты кому объясняешь-то? С чего ты взял, будто я думаю, что где-то внутри системы существуют имена WM_XXX, которыми оперируют при передаче сообщений? Если бы я подобное заподозрил о человеке твоего уровня — я бы, как минимум, переспросил прежде, чем пускаться в объяснения для школьников.
Текстами сообщений, которые возвращает FormatMessage, приложения при работе с системой тоже не оперируют, однако таблица этих сообщений в kernel32.dll существует. Зачем? Затем, что это удобно. Ничто не мешает каждой программе иметь свою собственную таблицу сообщений об ошибках, но когда-то (отнюдь не на заре винды) было решено, что лучше бы иметь ее в составе системы. Поскольку надобность в декодировании системных констант возникает регулярно — неплохо было бы иметь такие таблицы для всех типовых констант, если не в самой системе, то хоть в серьезных программерских инструментах вроде VS.
Сейчас вот нет отладчика, который знал бы имена всех общесистемных GUID'ов — а между тем, большинство из них известно уже больше десяти лет. Возьми MS за правило вести таблицы декодирования для всех своих констант — насколько приятнее стало бы отлаживаться.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Текстами сообщений, которые возвращает FormatMessage, приложения при работе с системой тоже не оперируют, однако таблица этих сообщений в kernel32.dll существует. Зачем? Затем, что это удобно. Ничто не мешает каждой программе иметь свою собственную таблицу сообщений об ошибках, но когда-то (отнюдь не на заре винды) было решено, что лучше бы иметь ее в составе системы. Поскольку надобность в декодировании системных констант возникает регулярно — неплохо было бы иметь такие таблицы для всех типовых констант, если не в самой системе, то хоть в серьезных программерских инструментах вроде VS.
Ну ладно, ладно. Можно, конечно, было бы сделать — в принципе. Можно и GUIDы тоже. Все можно.
Здравствуйте, Сергей Мухин, Вы писали:
СМ>кстати, есть Control Spy от MS, которая показывает как бегают сообщения (по имени), таки она сама все декодирует вроде.
Ну в конце концов есть же spy++. И есть его исходники (ну скорее не его самого, а упрощенной версии) в Platform SDK. Вот оттуда
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Нет ли в Win32 или какой-то из сопутствующих библиотек типа MFC функции, возвращающей имя сообщения WM_XXX по его коду, или таблички имен? Периодически хочется видеть в отладочном выводе сразу имя сообщения, чтобы не лазить в справочник, а таскать свою таблицу, даже в библиотеке, как-то некошерно.
Может оно и некошерно, но я вставлял в ресурс доступный мне заголовочный файл
с описанием сообщений и парсил его, благо, что формат прост.
Единственное (?) неудобство, что "новые" сообщения могут зависить от
контрола, т.е. могут быть и в одном диапазоне.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Ну в конце концов есть же spy++. И есть его исходники (ну скорее не его самого, а упрощенной версии) в Platform SDK.
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>Может оно и некошерно, но я вставлял в ресурс доступный мне заголовочный файл LT>с описанием сообщений и парсил его
Да коли у себя такое городить — проще один раз таблицу сделать.
PD>>Ну в конце концов есть же spy++. И есть его исходники (ну скорее не его самого, а упрощенной версии) в Platform SDK.
ЕМ>Ну да, есть. Это ты к чему?
К этому
SM>кстати, есть Control Spy от MS, которая показывает как бегают сообщения (по имени), таки она сама все декодирует вроде
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, Pavel Dvorkin, Вы писали:
ЕМ>>>Ну да, есть. Это ты к чему?
PD>>К этому
ЕМ>Ты еще один чукча, который не читатель, и тоже подумал, будто для меня представляет хоть какую-то сложность сделать это руками?
Женя, ты что-то нервинчать стал. Я и не тебе вовсе отвечал, а Сергею Мухину, и по частному моменту — показать, что в примерах от MS используется вот такое. С чего ты решил, будето я считаю, что ты этого не сможешь сделать ?