66 votes

Quelles sont les définitions de LPARAM et WPARAM ?

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

1 votes

Vous pourriez juste faire un clic droit sur LAPARAM et sélectionnez "Aller à la déclaration"...

5 votes

@John - Je pourrais si j'avais un IDE Visual C++, mais je fais du développement C#. Trouver les définitions réelles de ces choses prend beaucoup de temps si vous ne travaillez pas avec un IDE C++. J'ai dû suivre manuellement une piste de plusieurs typedefs pour trouver ce qui se trouvait à la fin de HACMDRIVERID. Si la documentation MSDN était correctement hyperliée, cela m'aurait évité bien des soucis.

2 votes

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

95voto

Charles Bailey Points 244082

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é 32 bits) sur win32 et unsigned __int64 (non signé 64 bits) sur x86_64.

Lien MSDN

2 votes

@Charles Bailey : peut-être que je vous comprends mal mais quand vous dites : "__int64 (signé 64-bit) sur x86", ne voulez-vous pas dire "sur x86-64" ou win64 ou autre ? Je prends x86 pour être 32-bit.

1 votes

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

0 votes

Veuillez noter que la description fait référence à long en C++. En C#, un long est une signature 64bit, également lors de la compilation en 32bit.

64voto

dan04 Points 33306

Ces typedefs remontent à l'époque des 16 bits. A l'origine, LPARAM était un long (signé 32 bits) et WPARAM était un WORD (non signé sur 16 bits), d'où le W et L . En raison de la pratique courante de passer des pointeurs castés comme paramètres de message, WPARAM a été étendu à 32 bits sur Win32, et les deux 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 LP préfixe, LPARAM n'est pas un pointeur distant vers un ARAM .

6voto

Brian R. Bondy Points 141769

LPARAM fait référence à un LONG_PTR et WPARAM à un UINT_PTR.

Sur x86, ils seront de 4 octets et sur x64, de 8 octets.

5voto

jpalecek Points 31928

Ici :

typedef UINT_PTR WPARAM;
typedef LONG_PTR LPARAM;

4voto

serialseb Points 5509

Ce dont vous avez besoin, mon ami, c'est http://www.pinvoke.net/

4 votes

Oui, c'est un site utile, bien que la qualité des conversions interop soit très mitigée

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X