问题是这样的:朋友将一个32位的MFC程序升级到64位后,原本正常的程序界面出现闪退现象。朋友找到我,让我帮忙解决。
因为这个问题是在操作界面后出现的,很自然需要进行断点调试。经过反复调试,发现问题出在往CListCtrl控件的条目中绑定数据的操作上,有问题的代码如下,各位看官看看能不能发现问题:

我们来分析上面的代码。上面的代码就是为CListCtrl添加一行数据,并为添加的这行数据绑定一个POSITION类型的变量。那这个问题出在哪呢?我们知道POSITION其实是MFC中用于标识一个列表中元素位置的指针,那既然是指针,如果你的程序是32位的,那这个指针就是32位的,也就是4个字节;如果程序是64位的,那这个指针就是64位的,也就是8个字节。但是我们知道DWORD无论在64位程序,还是32位程序中,都是四个字节。所以 m_list.SetItemData(sel, (DWORD)pos);这行代码在64位程序中就出问题了,他会将pos截断位32位。pos被截断后,肯定就不能指向正确的地址了。所以当我们在使用的地方调用m_list.GetItemData()在取出这个值时,取到的肯定就是错误的值,从而导致程序崩溃。
那么要解决这个问题也很简单,我们只需要将DWORD改成DWORD_PTR即可。
做个广告哈。如果你在开发中遇到任何问题,百思不得其解,需要找人帮忙时,可以评论区留言,也可以来https://item.taobao.com/item.htm?ft=t&id=983290328280找我。

1926

被折叠的 条评论
为什么被折叠?



