为了支持Win64的64位寻址,Windows API中添加了很少的*_PTR类型。
SetItemData(int nIndex,DWORD_PTR dwItemData)当我将第二个参数作为DWORD传递时,这个接口同时适用于64位和32位机器。
我想知道,如果我将第二个参数作为DWORD传递,这个特定的API在64位机器上是否会失败。如何测试失败场景?
谢谢,尼基尔
发布于 2011-05-03 18:14:27
如果您传递一个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.https://stackoverflow.com/questions/5867904
复制相似问题