windows - DWORD og DWORD\_PTR på 64 bit maskine

Indlæg af Hanne Mølgaard Plasc

Problem



Der er få *\_PTR typer tilføjet til Windows API for at understøtte Win64s 64bit adressering.


SetItemData(int nIndex,DWORD\_PTR dwItemData)


Denne API fungerer for både 64 og 32 bit maskiner, når jeg sender anden parameter som DWORD.


Jeg vil gerne vide, om denne særlige API vil mislykkes på 64 bit maskine, hvis jeg sender den anden parameter som DWORD. Hvordan kan jeg teste fejlscenariet?


Tak,
Nikhil

Bedste reference


Funktionen mislykkes, hvis du sender en DWORD, fordi den passer ind i en DWORD\_PTR. En peger er imidlertid garanteret at passe ind i en DWORD\_PTR men ikke til en DWORD på 64-bit platforme.


Denne kode er således korrekt:


int *before\_ptr = new int;
yourListBox.SetItemData(index, (DWORD\_PTR) before\_ptr);
int *after\_ptr = (int *) yourListBox.GetItemData(index);
ASSERT(before\_ptr == after\_ptr);  // Succeeds.
delete after\_ptr;                 // Works.


Men denne kode er forkert og afkortes tydeligt markøren til dens 32 bitere:


int *before\_ptr = new int;
yourListBox.SetItemData(index, (DWORD) before\_ptr);
int *after\_ptr = (int *) yourListBox.GetItemData(index);
ASSERT(before\_ptr == after\_ptr);  // Fails.
delete after\_ptr;                 // Undefined behavior, might corrupt the heap.