为了支持Win64的64位寻址,Windows API中添加了一些*_PTR
类型。
SetItemData(int nIndex,DWORD_PTR dwItemData)
当我传递第二个参数为DWORD
时,此API适用于64位和32位机器。
我想知道,如果我传递第二个参数为DWORD
,这个特定的API在64位机器上是否会失败。如何测试失败场景?
谢谢,Nikhil
如果传递DWORD
,该函数将不会失败,因为它适合DWORD_PTR
。然而,在64位平台上,指针保证适合DWORD_PTR
,而不适合适合DWORD
。
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.