2010-03-25 4 views
51

Je sais que je suis paresseux ici et je devrais chaluter les fichiers d'en-tête pour moi-même, mais quels sont les types réels pour les paramètres LPARAM et WPARAM? Sont-ils des pointeurs, ou des octets de quatre octets? Je fais du code d'interopérabilité C# et je veux être sûr de le faire fonctionner sur les systèmes x64.Quelles sont les définitions pour LPARAM et WPARAM?

+1

Vous pouvez simplement faire un clic droit sur 'LAPARAM' et sélectionner 'Aller à la déclaration' ... –

+1

@John - Je pourrais si j'avais un IDE C++ Visual, mais je fais C# dev. Trouver les définitions réelles de ces choses prend énormément de temps si vous ne travaillez pas avec un IDE C++. Je devais juste suivre manuellement une trace de plusieurs typedefs pour savoir ce qui se trouvait à la fin de HACMDRIVERID. Si la documentation MSDN était correctement liée à un lien hypertexte, cela m'aurait sauvé beaucoup de temps. –

+2

@Mark: Alors pourquoi cette question est-elle marquée C++? –

Répondre

72

LPARAM est un typedef pour LONG_PTR qui est un long (signé 32 bits) sur Win32 et __int64 (signé 64 bits) sur x86_64.

WPARAM est un typedef pour UINT_PTR qui est un unsigned int (non signé de 32 bits) sur Win32 et unsigned __int64 (non signé de 64 bits) sur x86_64.

MSDN link

+2

qui est un lien MSDN très utile, merci –

+0

@Charles Bailey: peut-être que je me méprends mais quand vous dites: "__int64 (signé 64 bits) sur x86" ne veux-tu pas dire "sur x86-64" ou win64 ou quelque chose? Je prends x86 pour être 32 bits. – User

+0

@User: Oui, c'est supposé dire x86_64, ce qui est la façon dont Microsoft se réfère maintenant à amd64. –

4

lParam fait référence à un LONG_PTR et WPARAM fait référence à un UINT_PTR

Sur x86, ils seront 4 octets et 64 bits, ils seront 8 octets.

4

Here:

typedef UINT_PTR WPARAM; 
typedef LONG_PTR LPARAM; 
3

Qu'est-ce que vous avez besoin de mon ami est http://www.pinvoke.net/

+1

oui, c'est un site utile, bien que des conversions d'interopérabilité de qualité très mélangées –

49

Ces typedefs remontent aux jours 16 bits. À l'origine, LPARAM était un long (signé 32 bits) et WPARAM était un WORD (non signé 16 bits), d'où le W and L. En raison de la pratique courante de passer des pointeurs casted comme paramètres de message, WPARAM a été étendu à 32 bits sur Win32, et à la fois LPARAM et WPARAM ont été étendus à 64 bits sur Win64. En C#, vous devez utiliser IntPtr pour LPARAM et UIntPtr pour WPARAM.

Notez que malgré le préfixe LP, LPARAM n'est pas un pointeur loin d'un ARAM.

+1

Merci pour le peu sur C#, m'a sauvé beaucoup de temps :) – Skurmedel

+30

+1 'ARAM' bwahahahahah – xanatos

Questions connexes