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. 如何测试失败场景?
谢谢,尼基尔
如果您传递 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)