2010-03-25 10 views
51

So che sono pigro qui e dovrei cercare tra i file di intestazione per me stesso, ma quali sono i tipi effettivi per i parametri LPARAM e WPARAM? Sono dei puntatori o quattro byte? Sto facendo un codice di interoperabilità C# e voglio essere sicuro di farlo funzionare su sistemi x64.Quali sono le definizioni per LPARAM e WPARAM?

+1

Si potrebbe semplicemente fare clic destro su 'LAPARAM' e selezionare 'Vai a dichiarazione' ... –

+1

@John - Potrei avere un IDE di Visual C++, ma sto facendo C# dev. Trovare le definizioni attuali di queste cose è fastidiosamente dispendioso in termini di tempo se non si sta lavorando con un IDE C++. Ho dovuto semplicemente seguire manualmente una traccia di diversi typedef per scoprire cosa c'era alla fine di HACMDRIVERID. Se la documentazione MSDN fosse correttamente collegata tramite hyperlink, mi avrebbe risparmiato un sacco di problemi. –

+2

@Mark: Allora perché questa domanda ha segnato C++? –

risposta

72

LPARAM è un typedef per LONG_PTR che è un long (segno a 32-bit) su Win32 e __int64 (segno a 64 bit) in x86_64.

WPARAM è un typedef per UINT_PTR che è un unsigned int (32 bit senza segno) su Win32 e unsigned __int64 (senza segno a 64 bit) in x86_64.

MSDN link

+2

che è un link MSDN molto utile, grazie –

+0

@Charles Bailey: forse ti sto fraintendendo ma quando dici: "__int64 (firmato a 64 bit) su x86" non intendi "su x86-64" o win64 o qualcosa? Prendo x86 per essere 32-bit. – User

+0

@User: Sì, si supponga di dire x86_64 che è il modo in cui Microsoft fa ora riferimento a amd64. –

4

LPARAM riferisce ad un LONG_PTR e WPARAM riferisce ad un UINT_PTR

Su x86 essi saranno 4 byte e 64 saranno 8 byte.

4

Here:

typedef UINT_PTR WPARAM; 
typedef LONG_PTR LPARAM; 
3

Quello che vi serve il mio amico è http://www.pinvoke.net/

+1

sì, è un sito utile, anche se le conversioni di interoperabilità di qualità molto mista –

49

Questi typedef risalgono ai giorni a 16 bit. Originariamente, LPARAM era un long (firmato a 32 bit) e WPARAM era un WORD (senza segno a 16 bit), quindi lo W and L. A causa della pratica comune di passare i puntatori casted come parametri del messaggio, WPARAM è stato esteso a 32 bit su Win32 e sia LPARAM sia WPARAM sono stati espansi a 64 bit su Win64.

In C#, è necessario utilizzare IntPtr per LPARAM e UIntPtr per WPARAM.

Si noti che nonostante il prefisso LP, LPARAM non è un puntatore lontano a un ARAM.

+1

Grazie per il bit su C#, mi ha risparmiato un sacco di tempo :) – Skurmedel

+30

+1 'ARAM' bwahahahahah – xanatos

Problemi correlati