Re[7]: Имя Win-сообщения по его коду
От: ononim  
Дата: 25.12.10 21:12
Оценка:
ЕМ>Речь вовсе не о том, какая тулза что выводит. Речь о том, что есть немалое количество программ, которым требуются символьные идентификаторы оконных сообщений — хоть для показа в окошке, как отладчику, хоть для вывода в лог, как любой мало-мальски сложной оконной программе на этапе отладки. Вынесение регулярно используемых компонент в стандартные общие модули давно стало нормальной практикой. Например, какой процент всех программ использует dbghelp.dll? Очень небольшой, однако эта DLL включена в стандартную поставку.
dbghelp включена в поставку думаю исключительно благодаря тому, что в ней есть miniDumpWriteDump, которой пользуются многие (наши — так ваще все) программы да и сама винда. Причем _любые_ программы, а не те, таргет аудиотрией которых являются программеры. Тогда логично было бы возмущаться почему с виндой не ставиться windbg (кстати и правда, очень жаль что не ставиться, постоянно приходится ставить если надо анализировать проблему вживую)

ЕМ>Почему Вас так удивляет мой вопрос о том, нет ли в одной из таких DLL таблицы имен сообщений?

Прежде всего потому, что это не надо для пользовательских/административных приложений.
Как много веселых ребят, и все делают велосипед...
Re[7]: Имя Win-сообщения по его коду
От: Pavel Dvorkin Россия  
Дата: 26.12.10 06:42
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, 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. Не иначе, мистика
With best regards
Pavel Dvorkin
Re[8]: Имя Win-сообщения по его коду
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 26.12.10 07:08
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Женя, у тебя перед Новым годом какой-то глюк

PD>Ну числа это, числа, константы то есть. Вот придет мне в голову блажь, забуду я вообще про этот #include <windows.h> и начну писать так

Это у тебя, Паша, приступ излишнего теоретизма. Это называется "имена сообщений, определенные в системе". Понимаешь — в системе, а не в C, C++ или бейсике. Вот идентификатор errno в ОС Windows не определен, ибо не имеет к ней никакого отношения — он определен только в CRT. А идентификатор NIL определен в паскале и модуле, и неизвестен в стандартных реализациях C/C++. А какой-нибудь WM_INITDIALOG в любой системе программирования, реализованной под виндой, будет определен одинаково. Догадаешься, почему?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: Имя Win-сообщения по его коду
От: Pavel Dvorkin Россия  
Дата: 26.12.10 08:18
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

PD>>Ну числа это, числа, константы то есть. Вот придет мне в голову блажь, забуду я вообще про этот #include <windows.h> и начну писать так


ЕМ>Это у тебя, Паша, приступ излишнего теоретизма. Это называется "имена сообщений, определенные в системе". Понимаешь — в системе, а не в C, C++ или бейсике. Вот идентификатор errno в ОС Windows не определен, ибо не имеет к ней никакого отношения — он определен только в CRT. А идентификатор NIL определен в паскале и модуле, и неизвестен в стандартных реализациях C/C++.



В системе, Женя, определены сообщения с номерами 0x201, 0x202 и т.д..

LRESULT WINAPI WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam);

Есть сообщение, его номер uMessage, тип переменной UINT, а еще к нему поставляются wParam и lParam соответствующих типов.

А имени никакого нет.

>А какой-нибудь WM_INITDIALOG в любой системе программирования, реализованной под виндой, будет определен одинаково. Догадаешься, почему?


Не-а

Делаем по шагам.

1. Создаем в VS новый Win32 проект. В нем будет диалоговая функция для диалога About
2. Перед этой функцией пишем

#undef WM_INITDIALOG

3. Компилируем

1>e:\1\1.cpp(179) : error C2065: 'WM_INITDIALOG' : undeclared identifier


Вот так! Был WM_INITDIALOG — и нет его, вечная ему память и упокой его души.

4.Заменяем

case WM_INITDIALOG:

на

case 0x110:

компилируем, запускаем и наслаждаемся видом диалога About, который даже и не знает, что его создали без этого #define совсем
With best regards
Pavel Dvorkin
Re[10]: Имя Win-сообщения по его коду
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 26.12.10 10:32
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>В системе, Женя, определены сообщения с номерами 0x201, 0x202 и т.д..


Е-мое, Паша, ты совсем стареешь, что ли? Возьми документацию на винду — не на "язык программирования C, C++, Fortran или Basic", а на саму систему — хоть Win 1.0, хоть Win32. Почему в описании сообщения WM_INITDIALOG это имя приведено, а код — нет? Написали бы с самого начала: "сообщение с кодом hex(110) посылается при инициализации диалогового окна", и так далее. Но почему-то так не сделали. Почему, как думаешь?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: Имя Win-сообщения по его коду
От: Pavel Dvorkin Россия  
Дата: 26.12.10 11:21
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Е-мое, Паша, ты совсем стареешь, что ли?


Старею, конечно. Но еще не совсем. А ты что, молодеешь ?

>Возьми документацию на винду — не на "язык программирования C, C++, Fortran или Basic", а на саму систему — хоть Win 1.0, хоть Win32. Почему в описании сообщения WM_INITDIALOG это имя приведено, а код — нет? Написали бы с самого начала: "сообщение с кодом hex(110) посылается при инициализации диалогового окна", и так далее. Но почему-то так не сделали. Почему, как думаешь?


И еще раз объясняю — нет такого имени. Ты язык-то все же вспомни. #define — это только имя времени препроцессирования, за пределами препроцессирования его нет.
А в документации да, приводятся имена из #define просто потому, что так удобнее, чем приводить номера. Но из этого вовсе не следует, что имя WM_INITDIALOG внутри Windows где-то существует.
With best regards
Pavel Dvorkin
Re[12]: Имя Win-сообщения по его коду
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 26.12.10 12:29
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>И еще раз объясняю — нет такого имени. Ты язык-то все же вспомни. #define — это только имя времени препроцессирования, за пределами препроцессирования его нет.

PD>А в документации да, приводятся имена из #define просто потому, что так удобнее, чем приводить номера. Но из этого вовсе не следует, что имя WM_INITDIALOG внутри Windows где-то существует.

Ты кому объясняешь-то? С чего ты взял, будто я думаю, что где-то внутри системы существуют имена WM_XXX, которыми оперируют при передаче сообщений? Если бы я подобное заподозрил о человеке твоего уровня — я бы, как минимум, переспросил прежде, чем пускаться в объяснения для школьников.

Текстами сообщений, которые возвращает FormatMessage, приложения при работе с системой тоже не оперируют, однако таблица этих сообщений в kernel32.dll существует. Зачем? Затем, что это удобно. Ничто не мешает каждой программе иметь свою собственную таблицу сообщений об ошибках, но когда-то (отнюдь не на заре винды) было решено, что лучше бы иметь ее в составе системы. Поскольку надобность в декодировании системных констант возникает регулярно — неплохо было бы иметь такие таблицы для всех типовых констант, если не в самой системе, то хоть в серьезных программерских инструментах вроде VS.

Сейчас вот нет отладчика, который знал бы имена всех общесистемных GUID'ов — а между тем, большинство из них известно уже больше десяти лет. Возьми MS за правило вести таблицы декодирования для всех своих констант — насколько приятнее стало бы отлаживаться.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[13]: Имя Win-сообщения по его коду
От: Pavel Dvorkin Россия  
Дата: 26.12.10 13:03
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Текстами сообщений, которые возвращает FormatMessage, приложения при работе с системой тоже не оперируют, однако таблица этих сообщений в kernel32.dll существует. Зачем? Затем, что это удобно. Ничто не мешает каждой программе иметь свою собственную таблицу сообщений об ошибках, но когда-то (отнюдь не на заре винды) было решено, что лучше бы иметь ее в составе системы. Поскольку надобность в декодировании системных констант возникает регулярно — неплохо было бы иметь такие таблицы для всех типовых констант, если не в самой системе, то хоть в серьезных программерских инструментах вроде VS.


Ну ладно, ладно. Можно, конечно, было бы сделать — в принципе. Можно и GUIDы тоже. Все можно.
With best regards
Pavel Dvorkin
Re[14]: Имя Win-сообщения по его коду
От: Сергей Мухин Россия  
Дата: 26.12.10 22:20
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:


PD>Ну ладно, ладно. Можно, конечно, было бы сделать — в принципе. Можно и GUIDы тоже. Все можно.



кстати, есть Control Spy от MS, которая показывает как бегают сообщения (по имени), таки она сама все декодирует вроде.
---
С уважением,
Сергей Мухин
Re[15]: Имя Win-сообщения по его коду
От: Pavel Dvorkin Россия  
Дата: 27.12.10 04:50
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>кстати, есть Control Spy от MS, которая показывает как бегают сообщения (по имени), таки она сама все декодирует вроде.


Ну в конце концов есть же spy++. И есть его исходники (ну скорее не его самого, а упрощенной версии) в Platform SDK. Вот оттуда


MSGDESC gaMsgs[] =
{
    { "WM_NULL", WM_NULL,                                   // 0x0000
        0, DecodeGeneric },
    { "WM_CREATE", WM_CREATE,                               // 0x0001
        0, DecodeGeneric },
    { "WM_DESTROY", WM_DESTROY,                             // 0x0002
        0, DecodeGeneric },
    { "WM_MOVE", WM_MOVE,                                   // 0x0003
        0, DecodeGeneric },
    { "WM_SIZE", WM_SIZE,                                   // 0x0005
        0, DecodeGeneric },
    { "WM_ACTIVATE", WM_ACTIVATE,                           // 0x0006
        0, DecodeGeneric },
    { "WM_SETFOCUS", WM_SETFOCUS,                           // 0x0007
        0, DecodeGeneric },
    { "WM_KILLFOCUS", WM_KILLFOCUS,                         // 0x0008
        0, DecodeGeneric },
    { "WM_ENABLE", WM_ENABLE,                               // 0x000A
        0, DecodeGeneric },
    { "WM_SETREDRAW", WM_SETREDRAW,                         // 0x000B
        0, DecodeGeneric },
    { "WM_SETTEXT", WM_SETTEXT,                             // 0x000C
        0, DecodeGeneric },
    { "WM_GETTEXT", WM_GETTEXT,                             // 0x000D
        0, DecodeGeneric },
    { "WM_GETTEXTLENGTH", WM_GETTEXTLENGTH,                 // 0x000E
        0, DecodeGeneric },
    { "WM_PAINT", WM_PAINT,                                 // 0x000F
        0, DecodeGeneric },
    { "WM_CLOSE", WM_CLOSE,                                 // 0x0010
        0, DecodeGeneric },
    { "WM_QUERYENDSESSION", WM_QUERYENDSESSION,             // 0x0011
        0, DecodeGeneric },
    { "WM_QUIT", WM_QUIT,                                   // 0x0012
        0, DecodeGeneric },


и т.д. Там и EM*, и CB* и т.д. есть
With best regards
Pavel Dvorkin
Re: Имя Win-сообщения по его коду
От: Leonid Troyanovsky  
Дата: 27.12.10 19:30
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Нет ли в Win32 или какой-то из сопутствующих библиотек типа MFC функции, возвращающей имя сообщения WM_XXX по его коду, или таблички имен? Периодически хочется видеть в отладочном выводе сразу имя сообщения, чтобы не лазить в справочник, а таскать свою таблицу, даже в библиотеке, как-то некошерно.


Может оно и некошерно, но я вставлял в ресурс доступный мне заголовочный файл
с описанием сообщений и парсил его, благо, что формат прост.
Единственное (?) неудобство, что "новые" сообщения могут зависить от
контрола, т.е. могут быть и в одном диапазоне.
--
С уважением, LVT
Re[16]: Имя Win-сообщения по его коду
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 28.12.10 02:51
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Ну в конце концов есть же spy++. И есть его исходники (ну скорее не его самого, а упрощенной версии) в Platform SDK.


Ну да, есть. Это ты к чему?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Имя Win-сообщения по его коду
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 28.12.10 02:51
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT>Может оно и некошерно, но я вставлял в ресурс доступный мне заголовочный файл

LT>с описанием сообщений и парсил его

Да коли у себя такое городить — проще один раз таблицу сделать.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[17]: Имя Win-сообщения по его коду
От: Pavel Dvorkin Россия  
Дата: 28.12.10 04:20
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:


PD>>Ну в конце концов есть же spy++. И есть его исходники (ну скорее не его самого, а упрощенной версии) в Platform SDK.


ЕМ>Ну да, есть. Это ты к чему?


К этому

SM>кстати, есть Control Spy от MS, которая показывает как бегают сообщения (по имени), таки она сама все декодирует вроде
With best regards
Pavel Dvorkin
Re[18]: Имя Win-сообщения по его коду
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 28.12.10 04:50
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

ЕМ>>Ну да, есть. Это ты к чему?


PD>К этому


Ты еще один чукча, который не читатель, и тоже подумал, будто для меня представляет хоть какую-то сложность сделать это руками?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[19]: Имя Win-сообщения по его коду
От: Pavel Dvorkin Россия  
Дата: 28.12.10 07:12
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Pavel Dvorkin, Вы писали:


ЕМ>>>Ну да, есть. Это ты к чему?


PD>>К этому


ЕМ>Ты еще один чукча, который не читатель, и тоже подумал, будто для меня представляет хоть какую-то сложность сделать это руками?


Женя, ты что-то нервинчать стал. Я и не тебе вовсе отвечал, а Сергею Мухину, и по частному моменту — показать, что в примерах от MS используется вот такое. С чего ты решил, будето я считаю, что ты этого не сможешь сделать ?
With best regards
Pavel Dvorkin
Re[20]: Имя Win-сообщения по его коду
От: Сергей Мухин Россия  
Дата: 28.12.10 10:20
Оценка: :)))
похоже зациклились
---
С уважением,
Сергей Мухин
Re[3]: Имя Win-сообщения по его коду
От: Leonid Troyanovsky  
Дата: 28.12.10 15:02
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Да коли у себя такое городить — проще один раз таблицу сделать.


Порядок действий можно и поменять, это ж не устав
--
С уважением, LVT
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.