Win32 - CreateDialogParam возвращается до или после WM_INITDIALOG - PullRequest
0 голосов
/ 31 октября 2011

Я передаю указатель на строку в DialogProc через CreateDialogParam. Этот указатель указывает на динамически выделенную память, которая освобождается сразу после возврата CreateDialogParam. Обрабатывается ли WM_INITDIALOG до возвращения CreateDialogParam?

Например:

LPWSTR lpStr = malloc( some_size )
CreateDialogParam( ... lpStr );
free( lpStr );

В DialogProc:

case WM_INITDIALOG:
  ... do something with lParam

Ответы [ 2 ]

4 голосов
/ 31 октября 2011

Да.Согласно документации для CreateDialogParam ,

Функция CreateDialogParam использует функцию CreateWindowEx для создания диалогового окна.Затем CreateDialogParam отправляет сообщение WM_INITDIALOG ... процедуре диалогового окна.

Рабочее слово здесь состоит в том, что он отправляет сообщение (в отличие от публикации).SendMessage просто вызывает процедуру диалога напрямую.PostMessage поместит сообщение в очередь.

Итак, да, WM_INITDIALOG должен завершиться до возврата CreateDialogParam.Вы можете проверить это относительно тривиально, используя отладчик и несколько точек останова.

0 голосов
/ 31 октября 2011

С http://msdn.microsoft.com/en-us/library/aa928175.aspx

Функция CreateDialogParam использует функцию CreateWindowEx для создания диалогового окна.Затем CreateDialogParam отправляет сообщение WM_INITDIALOG в процедуру диалогового окна.Функция отображает диалоговое окно, если шаблон определяет стиль WS_VISIBLE.Наконец, CreateDialogParam возвращает дескриптор окна диалогового окна.

Это говорит о том, что WM_INITDIALOG отправляется в диалоговое окно до его завершения.Однако это сообщение не обрабатывается до тех пор, пока оконный цикл сообщений в диалоговом окне не извлечет сообщение.Поскольку вы работаете с двумя отдельными потоками, вы не должны полагаться на это поведение.Если медленная операция выполняется синхронно в цикле сообщений окна, это может занять больше времени, чем остальная часть вызова CreateWindowEx.

РЕДАКТИРОВАТЬ: Согласно ответу Джоэла, документация подразумевает, что она отправляет (блокирует)сообщение, а не размещать его.Вы должны проверить это самостоятельно, прежде чем полагаться на какую-либо функциональность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...