понедельник, 1 декабря 2008 г.

Почему я должен возвращать это глупое значение из WM_DEVICECHANGE?

Это перевод Why do I have to return this goofy value for WM_DEVICECHANGE?

Чтобы запретить изъятие устройства из запроса, вы должны вернуть специальное значение BROADCAST_QUERY_DENY, любопытно, что значение этой константы равно $424D5144. Какая история скрывается за этим числом?

Ну, сначала мы попробовали взять сценарий от WM_QUERYENDSESSION, когда возврат TRUE разрешает операции продолжиться, а возврат FALSE блокирует её. Но когда мы реализовали это, мы обнаружили, что очень много программ блокировали запросы на удаления устройства - и при этом все эти программы были написаны для Windows 3.1, в которой не было Plug and Play! Как же это могло быть?

Эти программы думали: "ну, вот у меня прямо под рукой лежит Windows 3.1 SDK, и я изучил все сообщения, которые в нём есть. Те, которые мне нужны, я обрабатываю, а для всех остальных я просто возвращаю 0 вместо вызова DefWindowProc". И в Windows 3.1 это сходило им с рук, потому что они внимательно читали SDK, нашли пять или шесть сообщений, которые требовали ненулевое возвращаемое значение, и убедились, что эти сообщения у них обрабатываются и получают не нулевой код возврата. Все остальные сообщения возвращали ноль.

А потом в Windows 95 мы решили добавить новые сообщения, которые требовали ненулевой результат (который предоставлял DefWindowProc), в то время как эти программы продолжали возвращать ноль, и это приводило к блокировке всех запросов на изъятие устройства.

Поэтому нам пришлось изменить код "отмены" на что-то, что не было бы нулём. Чтобы сделать это изменение особенно безопасным, хорошо было бы, чтобы значение "отмены" также не равнялось бы 1, потому что мы начали подозревать, что есть не меньше программ, которые всегда просто возвращают единицу.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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