Что означают LRESULT, WPARAM и LPARAM?

я импортирую функции WinApi, пишу обратные вызовы и т. д. (пример) в C# и всегда удивляюсь:

  • что они означают ? LRESULT as последний результат ? ПАРАМ ? Л-ПАРАМ ?
  • как безопасно "обернуть" их
    • WPARAM и LPARAM иногда содержат структуры. Поэтому мне нужно использовать их как IntPtr. Как насчет LRESULT ? Я в безопасности с int или лучше IntPtr ?

какой тип я использую для LRESULT в C# ? int или IntPtr ?

4 ответов


enter image description here

Это Чарльз Симони, бывший глава группы прикладного программного обеспечения в Microsoft, группа, которая разработала Word и Excel. Это он установил стандарты именования идентификаторов. Поскольку никто не знает, как произносить его фамилию, они выбрали страну, в которой он родился, и назвали ее венгерской нотацией. Группа Windows также приняла его,но выбрала "плохой" вид, системный венгерский. Где первая буква(ы) идентификатора выбрана для обозначения тип переменной. В отличие от" хорошего " типа, Apps Hungarian, который выбирает префикс по имени логического типа вместо имени физического типа. Версия Симони.

Так это L как в Long, W как в Word. LPCWSTR-это сонный, длинный указатель на постоянную широкую строку. Явная проблема с System Hungarian заключается в том, что он больше не работает так хорошо, когда меняется архитектура. Первоначально выбран для 16-битных операционных систем (L=32-бит, W=16-бит), перенесенный в 32-бит без изменения имени (W=32-бит), мы находимся в 64-битном сегодня (L=W=64-бит).

Так что игнорируйте эти префиксы, они просто историческая случайность. Ты действительно!--10-->должны выберите IntPtr для типа LRESULT, это, безусловно, может быть 64-разрядное значение на 64-разрядной версии Windows. Очень трудно диагностировать проблемы, возникающие, когда вы этого не делаете, общий вопрос здесь.

вне темы, нечеткое изображение, которое вы видите на фоне фотографии, является интересным лакомый кусочек о Симони. Microsoft поделилась своим огромным успехом со своими сотрудниками и превратила многих из них в мультимиллионеров. То, что вы видите на заднем плане-снимок космический челнок пристыковался к Международной космической станции. Симони является одним из семи "космических туристов" и купил себе билет на МКС. Единственный, кто это сделал два раза, верните ему 60 миллионов долларов:)


имена пришли из исторических причин. В эпоху WIndows16 бит WPARAM означал Word-параметр и Lparam Long-параметр в венгерской нотации. переход к 32 битам свернул оба до одинакового размера (32-битные целые числа), но оставил имена без изменений. LRESULT означало длинный результат, и, опять же, имя сохраняется по историческим причинам. Другое изменение происходит, когда windows64 бит вышел. Пожалуйста!--3-->посмотрите здесь, в MSDN чтобы иметь полный список. В деталях: как параметр lparam и LRESULT - это typedef для LONG_PTR, где LONG_PTR:

#if defined(_WIN64)
 typedef __int64 LONG_PTR; 
#else
 typedef long LONG_PTR;
#endif

параметр wparam является typedef для UINT_PTR, где UINT_PTR - это:

#if defined(_WIN64)
 typedef unsigned __int64 UINT_PTR;
#else
 typedef unsigned int UINT_PTR;
#endif

вы можете видеть в основном типы, в конечном итоге указывающие на биты одного размера: единственная реальная разница заключается в том, используете ли вы windows 32 или 64. В терминах использование смысл, они общие параметры pourpose вы можете используйте в зависимости от того, что нужно сделать процедуре window. Как правило, поскольку пары чисел недостаточно, используются структуры данных poiter to complex и их значения передаются как WPARAM или LPARAM, поэтому вы не можете назначить какое-либо конкретное значение, если вы не фокусируете контекст.


LPARAM-это typedef для LONG_PTR, который является длинным (подписанным 32-разрядным) на win32 и __int64 (подписанным 64-разрядным) на x86_64.

WPARAM-это typedef для UINT_PTR, который является unsigned int (unsigned 32-bit) на win32 и unsigned __int64 (unsigned 64-bit) на x86_64.

typedef UINT_PTR WPARAM;

typedef LONG_PTR LPARAM;

в c# Вы можете использовать IntPtr

посмотреть какие определения для LPARAM и WPARAM?


вот пример венгерской нотации:

  • L Как LPARAM и LRESULT означает "длинный", обозначая 32-бит int
  • w на WPARAM означает "слово" (которое раньше было 16-битным int но теперь также 32 бит int - по крайней мере, при ориентации на 32-битную архитектуру)

предполагается, что остальные имена / псевдонимы типов намекают на их значение, т. е. LRESULT содержащий какое-то значение результата, LPARAM и WPARAM используется для переменных параметров.

фактическое значение wParam и lParam содержимое параметров зависит от конкретного отправляемого сообщения; это просто общие ведра для параметров сообщения. Поэтому вполне вероятно, что вы не сможете обойти небезопасные приведения типов.