Я знаю, что я ленив здесь, и я должен тралить файлы заголовков для себя, но каковы фактические типы для параметров LPARAM и WPARAM? Являются ли они указателями или четырьмя байтами ints? Я делаю код взаимодействия с С# и хочу быть уверенным, что я работаю над системами x64.
Каковы определения для LPARAM и WPARAM?
Ответ 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.
Ответ 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;
Ответ 5
Что вам нужно, мой друг http://www.pinvoke.net/