The function does not crash if you pass DWORDbecause it fits in DWORD_PTR. However, the pointer must be placed on DWORD_PTR, but not DWORDon 64-bit platforms.
So 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);
delete after_ptr;
32 :
int *before_ptr = new int;
yourListBox.SetItemData(index, (DWORD) before_ptr);
int *after_ptr = (int *) yourListBox.GetItemData(index);
ASSERT(before_ptr == after_ptr);
delete after_ptr;