...when altering one's mind becomes as easy as programming a computer, what does it mean to be human?..
понедельник, 1 декабря 2008 г.
Что означают буквы W и L в WPARAM и 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 комментариев:
Можно использовать некоторые HTML-теги, например:
<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>
Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.
Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.
Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.
Примечание. Отправлять комментарии могут только участники этого блога.
Хм, остался неосвещенным момент)
ОтветитьУдалитьСкажем, в связке Delphi XE (x32) и Win 7 (x64) прототипы функций должны все равно иметь параметры wParam/lParam разрядности 32. Обычно прототипы рекомендуется определять как
Proc(...; wParam,lParam: LongInt)...
возможно, более предусмотрительным было бы писать
Proc(...; wParam:WPARAM; lParam: LPARAM)...
как страховку на переход к 64bit компилятору. Вроде бы LongInt и должен соответствовать разрядности компилятора, но...
Александр, я прав?
Ну, очевидно, что Windows.pas будет исправлен в x64. Потому что, действительно, сейчас объявлено как LongInt, но в действительности там должен стоять тип плавающей размерности - WPARAM и LPARAM.
ОтветитьУдалитьНо это в Delphi. А, к примеру, в джедаевских заголовочниках все типы уже сейчас указаны точно, как есть, один-к-одному.
Получается, что сейчас Win x64 передает для нас все-таки 32bit параметры (вместо родных для системы 64bit) с помошью неких методов виртуализации?
ОтветитьУдалитьМы о каких сейчас приложениях говорим: 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 разрядной системе.
Спасибо, Александр. Именно это и хотелось уточнить)
ОтветитьУдалить