Хобрук: Ваш путь к мастерству в программировании

Безопасны ли вызовы PostMessage для дескриптора, который равен 0?

У меня есть модуль данных с дескриптором HWND, который принимает вызовы PostMessage.

Дескриптор выделяется в DataModuleCreate следующим образом (TTNONVISUAL не определен):

{$IFNDEF TTNONVISUAL}
FHWND := AllocateHWND(WindProc);
{$ELSE}
FHWND := 0;
{$ENDIF}

Модуль данных также используется в невизуальной программе, где определено TTNONVISUAL .

WindProc в модуле данных заключен в {$ IFNDEF TTNONVISUAL}, поэтому в невизуальной программе WindProc нет и FHWND = 0

Будет ли в этой программе безопасно выполнять вызовы PostMessage для этого дескриптора 0?

Примечание. PostMessage не отправляет никаких дополнительных данных:
PostMessage (FHWND, WM_SYNC_PROGRESS, 0,0)
и WM_SYNC_PROGRESS - это WM_USER + 111, и других обработчиков WM_SYNC_PROGRESS нет.

28.06.2013

Ответы:


1

В документации говорится:

[При передаче NULL для дескриптора, который относится не к варианту Null, а к фактическому значению 0]:

Функция ведет себя как вызов PostThreadMessage с параметром dwThreadId, установленным на идентификатор текущего потока.

Итак, отправка сообщений на 0 имеет особое значение, и вы не должны просто разрешать это, если действительно хотите предать сообщения забвению. В таком случае лучше проверить, является ли дескриптор 0, а не публиковать сообщение вообще.

Обратите внимание, однако, что создание окна совершенно законно даже в невизуальном приложении. Подобные дескрипторы предназначены для отправки сообщений. Они не обязательно указывают на видимое окно. Собственно, для этого и предназначен AllocateHWND. Он используется для невизуальных элементов управления (например, TTimer), которые в конце концов должны иметь возможность получать сообщения.

28.06.2013
  • Вы можете создать для этого свою собственную функцию-оболочку, вместо того, чтобы помещать множество if во многих местах вашего кода. 28.06.2013
  • Новые материалы

    Тег скрипта в вашем HTML-документе
    Вековые дебаты среди сообщества разработчиков, таких как страны союзников и коммунисты времен Второй мировой войны, все еще продолжаются до сегодняшнего дня о том, где лучше всего разместить..

    Введение в Машинное обучение Azure
    Машинное обучение Azure (AML) — это облачная служба машинного обучения, которая позволяет быстро и легко создавать, обучать и развертывать модели машинного обучения. Он предоставляет ряд..

    Обработка ошибок Javascript
    попробовать / поймать / наконец / бросить Обработка ошибок Javascript может помочь отладить код. Это отличный инструмент для понимания и соответствия. Это может быть не самый веселый пост, но,..

    Лучшие и необходимые инструменты внешнего интерфейса
    Интернет полон различных инструментов программирования, которые помогают современному разработчику делать вещи быстрее и качественнее, чем когда-либо прежде. Если вы наткнулись на эту статью, вы,..

    Ограничения длины, которые вы должны знать как веб-разработчик
    В коде заголовок веб-страницы определяется тегом title, который появляется в верхней части html-документа внутри тега head. Теоретически содержимое тега title может быть любым, если вы его..

    Написание собственного кода Java во Flutter для Android
    Реализация Java в приложениях Flutter Flutter имеет богатый набор пакетов и виджетов. Вы можете добиться большинства вещей, используя богатый пул виджетов, который предлагает Flutter, или..

    ASCII и Юникод (UTF)
    ASCII (Американский стандартный код обмена информацией). Представление текста с помощью чисел. Первоначально он был разработан для телетайпов, по сути, для обычного текста без форматирования...