64位机器上的DWORD和DWORD_PTR

时间:2011-05-03 10:01:37

标签: windows winapi mfc

为了支持Win64的64位寻址,Windows API中添加了少量*_PTR类型。

SetItemData(int nIndex,DWORD_PTR dwItemData)

当我将第二个参数作为DWORD传递时,此API适用于64位和32位计算机。

我想知道,如果这个特定的API在64位机器上失败,如果我将第二个参数作为DWORD传递。如何测试失败场景?

谢谢, NIKHIL

1 个答案:

答案 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.