Windows 64位机器上的DWORD和DWORD_PTR

Windows 64位机器上的DWORD和DWORD_PTR,windows,winapi,mfc,Windows,Winapi,Mfc,为了支持Win64的64位寻址,在Windows API中添加的*\u PTR类型很少 SetItemData(int nIndex,DWORD_PTR dwItemData) 当我将第二个参数作为DWORD传递时,此API适用于64位和32位机器 我想知道,如果这个特定的API在64位机器上失败,如果我以DWORD的形式传递第二个参数。如何测试失败场景 谢谢, Nikhil如果您传递一个DWORD,该函数不会失败,因为它适合DWORD\u PTR。但是,指针保证适合于64位平台上的DWORD

为了支持Win64的64位寻址,在Windows API中添加的
*\u PTR
类型很少

SetItemData(int nIndex,DWORD_PTR dwItemData)
当我将第二个参数作为
DWORD
传递时,此API适用于64位和32位机器

我想知道,如果这个特定的API在64位机器上失败,如果我以
DWORD
的形式传递第二个参数。如何测试失败场景

谢谢,
Nikhil

如果您传递一个
DWORD
,该函数不会失败,因为它适合
DWORD\u 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.

您是正确的,指针将不适合64位的DWORD,它将截断指针。我如何测试此失败场景,其中我的指针将截断,我将获得不需要的值。我尝试了此操作,但没有得到任何断言:“CString str(”);对于(int i=0;i<20;i++){str.Format(_T(“项字符串%d”),i);XcomboCtr.AddString(str);}int在_ptr=new int之前;BOOL bsetItemData=XcomboCtr.SetItemData(0,(DWORD)在ptr之前);int*after_ptr=(int)(XcomboCtr.GetItemData(0));断言(在\u ptr之前==在\u ptr之后);//失败。在\u ptr;之后删除@Nikhil,假设您是在调试模式下构建的(在发布模式下不会编译
ASSERT
),这可能意味着您的指针的上32位都是零。在这种情况下,它会起作用,但你不能保证你所有的指针都是这样。上帝保佑你@Frédéric Hamidi,你节省了我很多时间!