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

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

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

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

Ответ 1

enter image description here

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

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

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

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

Ответ 2

Эти имена исходили из исторических причин. В возрасте WIndows16 бит WPARAM означал параметр Word-Parameter и LPARAM Long-Parameter в венгерской нотации. переход к 32-разрядному свернутому как к одному и тому же размеру (32-битные целые числа), но оставил имена без изменений. LRESULT означает длительный результат, и, опять же, имя хранится по историческим причинам. Другое изменение происходит, когда бит Windows64 вышел. Пожалуйста, посмотрите здесь, в 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

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

Ответ 3

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

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

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

Фактическое значение содержимого параметров WPARAM и LPARAM зависит от конкретного отправляемого сообщения; это всего лишь общие ведра для параметров сообщений. Поэтому вполне вероятно, что вы не сможете обойти опасные типы бросков.

Ответ 4

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

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

typedef UINT_PTR WPARAM;

typedef LONG_PTR LPARAM;

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

См. Каковы определения для LPARAM и WPARAM?