Mark Heath
Mark Heath

Reputation: 49502

What are the definitions for LPARAM and WPARAM?

I know I'm being lazy here and I should trawl the header files for myself, but what are the actual types for LPARAM and WPARAM parameters? Are they pointers, or four byte ints? I'm doing some C# interop code and want to be sure I get it working on x64 systems.

Upvotes: 75

Views: 85310

Answers (6)

dan04
dan04

Reputation: 91179

These typedefs go back to the 16-bit days. Originally, LPARAM was a long (signed 32-bit) and WPARAM was a WORD (unsigned 16-bit), hence the W and L. Due to the common practice of passing casted pointers as message parameters, WPARAM was expanded to 32 bits on Win32, and both LPARAM and WPARAM were expanded to 64 bits on Win64.

In C#, you should use IntPtr for LPARAM and UIntPtr for WPARAM.

Note that despite the LP prefix, LPARAM is not a far pointer to an ARAM.

Upvotes: 73

superbem
superbem

Reputation: 479

c++ in linux and windows 64bit tested, the most simple solution I found:

#define WPARAM long long unsigned int
#define LPARAM long long int

Upvotes: 0

CB Bailey
CB Bailey

Reputation: 792517

LPARAM is a typedef for LONG_PTR which is a long (signed 32-bit) on win32 and __int64 (signed 64-bit) on x86_64.

WPARAM is a typedef for UINT_PTR which is an unsigned int (unsigned 32-bit) on win32 and unsigned __int64 (unsigned 64-bit) on x86_64.

MSDN link

Upvotes: 105

SerialSeb
SerialSeb

Reputation: 6766

What you need my friend is http://www.pinvoke.net/

Upvotes: 3

jpalecek
jpalecek

Reputation: 47770

Here:

typedef UINT_PTR WPARAM;
typedef LONG_PTR LPARAM;

Upvotes: 5

Brian R. Bondy
Brian R. Bondy

Reputation: 347416

LPARAM refers to a LONG_PTR and WPARAM refers to a UINT_PTR

On x86 they will be 4 bytes and on x64 they will be 8 bytes.

Upvotes: 6

Related Questions