- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
long __stdcall wndproc(HWND wnd, unsigned int message, WPARAM wparam, LPARAM lparam)
{
switch(message)
{
case WM_USER + 100:
{
char data[128];
fill_data(data);
PostMessage(wnd, WM_USER + 666, 0, (LPARAM)data);
return 0;
}
case WM_USER + 666:
{
char * data = (char *)lparam;
use_data(data);
return 0;
}
//etc
someone 05.02.2013 20:20 # +4
Кстати, на 64-битной архитектуре возвращаемое значение поплывёт - скажем спасибо MS за 32-битный long. Нельзя было объявить как LRESULT или тогда уж LONG_PTR?
Xom94ok 05.02.2013 21:01 # +3
Видимо, комплексы свои они так компенсируют; косвенно на это указывает псевдоним LONG, выглядящий "толще" обычного long-а.
someone 06.02.2013 08:25 # +1
govnomonad 06.02.2013 10:49 # 0
dwarf_with_beer 05.02.2013 22:37 # +1
TarasB 06.02.2013 09:53 # 0
LispGovno 06.02.2013 09:56 # 0
Хуйню сказал.
TarasB 06.02.2013 10:52 # 0
Ccik 06.02.2013 11:20 # 0
Ccik 06.02.2013 11:21 # 0
TarasB 06.02.2013 12:23 # 0
absolut 06.02.2013 13:05 # +1
TarasB 06.02.2013 13:30 # −2
absolut 06.02.2013 13:41 # 0
http://bit.ly/14RuoiA
А если соглашения нет, то порушить можно всё что угодно.
Ccik 06.02.2013 14:20 # 0
TarasB 06.02.2013 15:24 # 0
Я проверил, на WM_SIZE написал вывод в заголовок указателя на параметр Handle, при старте он не такой, как при работе, но во время работы он у меня не менялся.
Ccik 06.02.2013 23:53 # 0
Ccik 06.02.2013 23:53 # 0
TarasB 07.02.2013 10:04 # 0
Не такой он потому, что при первом вызове WM_SIZE (происходит при создании окна) на стеке отладчик видит только оконную функцию (видимо глубже там системные функции, которые он не различает), а при других WM_SIZE, инициированных пользователем, на стеке видно процедуру, в которой вызывается цикл обработки сообщений и 4 вызова оконной функции.
TarasB 07.02.2013 10:14 # 0
В общем, автор кода - очень везучий.
bormand 07.02.2013 10:46 # +1
Если бы между приходами WM_USER+100 и WM_USER+666 закралось бы еще одно сообщение, то его обработчик вполне мог засрать область памяти, в которой лежала data, своими локальными переменными, и WM_USER+666 прочитал бы мусор.
TarasB 07.02.2013 10:58 # 0
Ccik 07.02.2013 12:20 # 0
bormand 07.02.2013 12:37 # +1
Ну если память не изменяет - типичный цикл обработки сообщений выглядит так: Отсюда и гарантия одной глубины (но нет никакой гарантии, что тот же TranslateMessage или обработчики соседних сообщений не похерят данные в data).
anonimb84a2f6fd141 07.02.2013 12:52 # +2
Все правильно зделал!
TarasB 07.02.2013 13:15 # 0
Впрочем да, есть подвох в том, что можно вызвать ProcessMessages посреди сложного расчёта, но это не самый типичный случай.