64位机器上的DWORD和DWORD_PTR



为了支持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.

相关内容

  • 没有找到相关文章

最新更新