Что означают LRESULT, WPARAM и LPARAM?
я импортирую функции WinApi, пишу обратные вызовы и т. д. (пример) в C# и всегда удивляюсь:
- что они означают ?
LRESULT
as последний результат ? ПАРАМ ? Л-ПАРАМ ? - как безопасно "обернуть" их
-
WPARAM
иLPARAM
иногда содержат структуры. Поэтому мне нужно использовать их какIntPtr
. Как насчетLRESULT
? Я в безопасности сint
или лучшеIntPtr
?
-
какой тип я использую для LRESULT в C# ? int
или IntPtr
?
4 ответов
Это Чарльз Симони, бывший глава группы прикладного программного обеспечения в 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
содержимое параметров зависит от конкретного отправляемого сообщения; это просто общие ведра для параметров сообщения. Поэтому вполне вероятно, что вы не сможете обойти небезопасные приведения типов.