您的位置:首页 > 其它

error C2440: "reinterpret_cast":无法从"NMHDR*"转换为"NMITEMACTIVATE"

2010-10-22 19:01 393 查看
VC 2008 LIST CONTROL的BUG
随着.NET平台的推出,微软的IDE越来越傻瓜化,编程的门槛越来越低。VS2003还没学会,马上就出了VS2005,一转眼现在己是VS2008当道。而对于MFC程序员来说,似乎受到了冷落,自VC6.0到现在,MFC几乎没有更新,因此很多程序员还在坚守经典的VC6.0。
我这个菜鸟程序员也跟着从VC6.0到VS2005,到现在的VS2008。虽说VS2008身材臃肿,比VC6.0慢了不少,但其强大的编辑功能还是让我爱不释手,这次的主角就是VS 2008。
我用得最多的就是在VS2008下用C++编程,这两天为了赶一个项目,忙得昏天喑地。处理LIST控件的NM_DBCLIK消息应该是每个程序员都会的事情,我的处理函数如下:
void CDlgTg::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE>(pNMHDR);
... //这里省略我的代码
*pResult = 0;
}
一编译,竞然报错:
error C2440: "reinterpret_cast":无法从"NMHDR*"转换为"NMITEMACTIVATE"
这可不是我的代码,这是大名鼎鼎的微软给我自动生成的。由于忙了很久,头脑有点乱(归根到底还是自己太菜_:) ),百思不得其解,VS2008可是Microsoft的拳头产品,对最新C++标准支持是最好的。
休息几分钟,再来看,终于明白。pNMHDR是一个指针,reinterpret_cast把NMHDR *强制转换成NMITEMACTIVATE,应该说这种这种转换在任何时候都行不通。对指针稍微了解的人都知道,其本意是想转换成NMITEMACTIVATE*, 这一下豁然开朗,其实就是少了一个字符。把代码改成:
void CDlgTg::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE*>(pNMHDR);
... //这里省略我的代码
*pResult = 0;
}
顺利通过。
后来测试了一下,NM_CLICK消息也有这样的问题。由此猜想可能处理其他通用控件消息的时候也会有这样的问题(待证实)。
到此问题顺利解决,只是不知道是我机器的问题,还是Microsoft的问题。如果Microsoft的问题,心中不免暗自得意,原来Microsoft的程序员也有粗心的时候(原来大公司的程序员也不是那么神秘...)。VS2008傻爪化的功能提高效率的同时,也埋下了隐患。我们这些还在用C++的古董程序员在出现问题的时候还是不要过于依赖IDE。

源文档 <http://www.raildoor.com/blog/u/2956/archives/2009/1431.html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐