2011-05-03 258 views
3

为了支持Win64的64位寻址,很少有*_PTR类型添加到Windows API中。64位机器上的DWORD和DWORD_PTR

SetItemData(int nIndex,DWORD_PTR dwItemData) 

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

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

感谢, 尼基尔

回答

3

如果传递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. 
+0

你是正确的指针将不适合在64位DWORD,它会截断pointer.How我可以测试这种失败的情况下,我的指针将截断,我会得到不想要的价值。 – Nikhil 2011-05-03 10:26:50

+0

@Nikhil,我试图修改我对这种情况的回答。 – 2011-05-03 10:35:15

+0

感谢您的快速和详细的解释.... – Nikhil 2011-05-03 10:55:24

相关问题