DWORD and DWORD_PTR on 64 bit machine
10,471
The function will not fail if you pass a DWORD
, because it fits into a DWORD_PTR
. A pointer, however, is guaranteed to fit into a DWORD_PTR
but not into a DWORD
on 64-bit platforms.
Thus, this code is correct:
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.
But this code is wrong and will silently truncate the pointer to its lower 32 bits:
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.
Author by
Nikhil
Updated on June 30, 2022Comments
-
Nikhil almost 2 years
There are few
*_PTR
types added to the Windows API in order to support Win64's 64bit addressing.SetItemData(int nIndex,DWORD_PTR dwItemData)
This API works for both 64 and 32 bit machines when I pass second parameter as
DWORD
.I want to know, if this particular API will fail on 64 bit machine, if I pass the second parameter as
DWORD
. How can I test the fail scenario?Thanks, Nikhil
-
Nikhil about 13 yearsYou are correct the pointer will not fit into DWORD on 64 bit and it will truncate the pointer.How can i test this fail scenario where my pointer will truncate and i will get undesired value.
-
Nikhil about 13 yearsI tried this but i am not getting any assertion: 'CString str(""); for (int i=0;i < 20;i++) { str.Format(_T("item string %d"), i); XcomboCtr.AddString( str ); } int before_ptr = new int; BOOL bsetItemData= XcomboCtr.SetItemData(0, (DWORD)before_ptr); int *after_ptr = (int)( XcomboCtr.GetItemData(0)); ASSERT(before_ptr == after_ptr); // Fails. delete after_ptr; '
-
Frédéric Hamidi about 13 years@Nikhil, assuming you're building in debug mode (the
ASSERT
won't be compiled in release mode), it might mean that your pointer's upper 32 bits are all zeroes. In that case, it will work, but you can't guarantee that all your pointers will be like that.