There are few *_PTR
types added to the Windows API in order to support Win64\'s 64bit addressing.
SetItemData(int nIndex,DWORD_PTR dwItemData)
<
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.