Функция не выйдет из строя, если вы передадите DWORD
, потому что она вписывается в DWORD_PTR
. Однако указатель гарантированно помещается в DWORD_PTR
, но , а не в DWORD
на 64-битных платформах.
Таким образом, этот код является правильным:
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.
Но этот код неверен и будет молча обрезать указатель до его младших 32 бит:
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.