64 位机器上的 DWORD 和 DWORD_PTR

Nik*_*hil 5 windows winapi mfc

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

SetItemData(int nIndex,DWORD_PTR dwItemData)
Run Code Online (Sandbox Code Playgroud)

当我将第二个参数作为DWORD.

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

谢谢,尼基尔

Fré*_*idi 6

如果您传递 a ,该函数不会失败DWORD,因为它适合 a DWORD_PTR。然而,在 64 位平台上,指针保证适合 a DWORD_PTR,但不能适合 a。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.
Run Code Online (Sandbox Code Playgroud)

但这段代码是错误的,它会默默地将指针截断为低 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.
Run Code Online (Sandbox Code Playgroud)