为了支持Win64的64位寻址,Windows API中添加了少量*_PTR
类型。
SetItemData(int nIndex,DWORD_PTR dwItemData)
当我将第二个参数作为DWORD
传递时,此API适用于64位和32位计算机。
我想知道,如果这个特定的API在64位机器上失败,如果我将第二个参数作为DWORD
传递。如何测试失败场景?
谢谢, NIKHIL
答案 0 :(得分:4)
如果您传递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.