Вот возник вопрос, который казался по-началу не таким уж великосложным.
Задача следующая. Есть какая-то основная программ Win32. Есть диалог. В какой-то момент этот диалог вызывается. Пользователь что-то в нем делает, работает с какими-то данными. Потом жмет "ОК" - диалог закрывается. По результатам работы диалога в основной программе случается то или иное. Вывод - из диалога нужно что-то вернуть. Если сможем вернуть хоть какое-то значение, значит можем вернуть все что угодно. Вроде бы у диалога есть WinProc, который возвращает какие-то значения. Но выполнение возвращается туда, откуда была вызвана WinProc, а она вызвана по сути системой, т.е. мы попадем куда-то в user32. А нам нужно вернуть что-то в то место, откуда была вызвана инициализация диалога. Значит возврат с WinProc не подойдет.
В общем-то это напоминает работу MessageBox - а. Нашел в загашниках исходник msgbox. Логично предположил что все счастье кроется в WinProc-е msgbox-а. Логично было бы предположить что чудо случается где-то WM_CLOSE и иже с ними. А нет. Мало того, стоять case-ы на IDOK, IDCANCEL, IDNO и т.д., но обработчиков их нет.
Зато есть что-то интересное в WM_INITDIALOG. Там вызывается ф-я NotifyWinEvent. Хуки? Но опять так, как это поможет?
В общем, с msgbox примера взять не получается. Ну как минимум на это нужно потратить очень много времени, и боюсь того что у меня есть по msgbox не хватит для полного разбора
Какие мысли у меня по этому поводу.
Первое что пришло в голову - события. После инициализации диалога, послать WM_USER сообщение, и передать HANDLE события, предварительно установив его в занятое состояние. По окончанию работы диалога, сбрасывать событие. Но событие придется ждать, а это плохо - вызывающий поток не будет работать. Можно создать еще один поток, и ждать в нем, тогда первый вызывающий поток не будет стоять в ожидании. Три потока на 1 msgbox (включая вызывающий) - уже не хило. Ну а для того, чтобы что-то вернуть с диалога можно передавать вместе с HANDLE и указатель на callback - функцию для передачи данных на вызывающую сторону. Возвращать можно в параметры через указатель на указатель на сами данные. И все это нужно будет запихнуть в функцию-обертку,которая наконец и вернет то что нужно на вызывающую сторону. Но это ж жуть а не способ. Такую обертку делать над элементарными функционалами...
Второе что пришло в голову - хуки. Ловить закрытие диалога. Я с хуками совсем не работал, как оповещение о том что событие случилось не понятно. И кого оповещать? Не вызывающую же сторону.
Гуглить я пробовал, но что-то не знаю как вопрос сформулировать.
Может кто-нибудь что-нибудь подсказать? Интерес частично академический, частично - есть куда применить.
(Хакер, надеюсь может ты чего напишешь)