Я знаю, что я ленив здесь, и я должен тралить файлы заголовков для себя, но каковы фактические типы для параметров 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/