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

Я знаю, что я ленив здесь, и я должен тралить файлы заголовков для себя, но каковы фактические типы для параметров LPARAM и WPARAM? Являются ли они указателями или четырьмя байтами ints? Я делаю код взаимодействия с С# и хочу быть уверенным, что я работаю над системами x64.

Ответ 1

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

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

Ссылка MSDN

Ответ 2

Эти typedefs возвращаются к 16-битным дням. Первоначально LPARAM был long (подписанный 32-разрядный), а WPARAM был WORD (unsigned 16-bit), следовательно W и L. Из-за распространенной практики передачи кастинговых указателей в качестве параметров сообщения WPARAM был расширен до 32 бит в Win32, а оба LPARAM и WPARAM были расширены до 64 бит на Win64.

В С# вы должны использовать IntPtr для LPARAM и UIntPtr для WPARAM.

Обратите внимание, что, несмотря на префикс LP, LPARAM не является далеко указателем на ARAM.

Ответ 3

LPARAM относится к LONG_PTR, а WPARAM относится к UINT_PTR

В x86 они будут 4 байта, а на x64 они будут 8 байтов.

Ответ 4

Здесь:

typedef UINT_PTR WPARAM;
typedef LONG_PTR LPARAM;