2011-05-03 79 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

相關問題