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

VC 2008 LIST CONTROL的BUG

随着.NET平台的推出,微软的IDE越来越傻瓜化,编程的门槛越来越低。VS2003还没学会,马上就出了VS2005,一转眼现在己是VS2008当道。而对于MFC程序员来说,似乎受到了冷落,自VC6.0到现在,MFC几乎没有更新,因此很多程序员还在坚守经典的VC6.0

我这个菜鸟程序员也跟着从VC6.0VS2005,到现在的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_castNMHDR *强制转换成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>

你可能感兴趣的:(error)