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

Что означают буквы W и L в WPARAM и LPARAM?

Это перевод What do the letters W and L stand for in WPARAM and LPARAM? Автор: Реймонд Чен.

Давным-давно, Windows была 16-ти разрядной. Каждое сообщение могло нести с собой две части данных, называемые WPARAM и LPARAM.
Первый параметр в 16-ти разрядной Windows был 16-ти битным значением ("словом", "word"), поэтому он назывался W. Второй был 32-х битным ("длинным", "long"), поэтому он назывался L.

Параметр W использовался для передачи чисел и дескрипторов, а параметр L - для передачи указателей.

Когда Windows стала 32-х битной, параметр WPARAM подрос до 32-х битного значения. Поэтому, хотя "W" и означает "word" ("слово"), но теперь уже это больше не слово (а в 64-х битных Windows оба параметра вообще стали 64-х битными!).

Это полезно, чтобы понять происхождение этого термина. Если вы посмотрите на дизайн оконных сообщений, то вы увидите следующее: если сообщение принимает указатель, то этот указатель, как правило, передаётся в LPARAM. А если сообщение принимает описатель или просто число, то оно передается в WPARAM. Если же сообщение принимает оба параметра, то целое идёт в WPARAM, а указатель - в LPARAM.

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

5 комментариев:

  1. Хм, остался неосвещенным момент)

    Скажем, в связке Delphi XE (x32) и Win 7 (x64) прототипы функций должны все равно иметь параметры wParam/lParam разрядности 32. Обычно прототипы рекомендуется определять как
    Proc(...; wParam,lParam: LongInt)...
    возможно, более предусмотрительным было бы писать
    Proc(...; wParam:WPARAM; lParam: LPARAM)...
    как страховку на переход к 64bit компилятору. Вроде бы LongInt и должен соответствовать разрядности компилятора, но...

    Александр, я прав?

    ОтветитьУдалить
  2. Ну, очевидно, что Windows.pas будет исправлен в x64. Потому что, действительно, сейчас объявлено как LongInt, но в действительности там должен стоять тип плавающей размерности - WPARAM и LPARAM.

    Но это в Delphi. А, к примеру, в джедаевских заголовочниках все типы уже сейчас указаны точно, как есть, один-к-одному.

    ОтветитьУдалить
  3. Получается, что сейчас Win x64 передает для нас все-таки 32bit параметры (вместо родных для системы 64bit) с помошью неких методов виртуализации?

    ОтветитьУдалить
  4. Мы о каких сейчас приложениях говорим: 32 или 64 битных?

    64 битные приложения, разумеется, используют 8-ми байтные аргументы. Любое приложение должно быть перекомпилировано, чтобы стать 64 разрядным. Вот в этот момент (момент пересборки) 4-х байтные параметры в нём меняются на 8 байтные.

    32 битные приложения, разумеется, используют 4-х байтные аргументы. Как они могут использовать 8 байтные, если они были скомпилированы с 4 байтными? От того, что вы запускаете 32 байтное приложение в 64 батной среде, оно волшебным образом не будет пересобрано (перекомпилировано) как 64 разрядное и использовать 8 байтные аргументы. Это надо понимать. Оно останется таким же, каким и было (мы ведь про Native говорим, а не про .NET).

    Ведь и указатели для 32 разрябного приложения будут 4 байтовыми даже на 64 разрядной системе.

    В 64 разрядной среде все 32 битные приложения запускаются в режиме эмуляции через механизм WOW64 (Windows-on-Windows) - примерно так же как в 95-м году все 16 битные приложения запускались в режиме эмуляции WOW32 на 32 разрядной системе.

    ОтветитьУдалить
  5. Анонимный1 мая 2011 г., 14:33

    Спасибо, Александр. Именно это и хотелось уточнить)

    ОтветитьУдалить

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

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

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

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

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