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>
随着.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>
相关文章推荐
- error C2440: "reinterpret_cast":无法从"NMHDR*"转换为"NMITEMACTIVATE"
- MFC listctrl NMCLICK消息 错误 无法从"NMHDR*"转换为"NMITEMACTIVATE"
- error C2440 reinterpret_cast 无法从NMHDR *转换为NMITEMACTIVATE
- 类型"string"的值无法转换为"System.Drawing.Color"
- error c2243:"类型转换" 转换存在,但无法访问
- VS2008 V2010 平台迁移中:error C2440: "static_cast"
- VC2010——error C2440 “static_cast” 无法从“void (_thiscall )(void)”转换为“LRESULT
- error C2440: “static_cast”: 无法从“void (__thiscall CPppView::* )(WPARAM,LPARAM)”转换为“LRESULT (__thiscal
- error C2440 “static_cast” 无法从“void (__thiscall CPppView )(void)”转换为“LRESULT (__thisca
- error C2440: “static_cast”: 无法从“void (__thiscall CChatDlg::* )(WPARAM,LPARAM)”转换为“LRE
- static_cast” : 无法从“void (__thiscall CMainFrame::* )(NMTOOLBARA *,LRESULT *)”转换为“void (__thiscall CCmdTarget::* )(NMHDR *,LRESULT
- 【转】error C2440 “static_cast” 无法从“void (__thiscall CPppView )(void)”转换为“LRESULT (__thiscall CWnd )(WPARAM,LPARAM)”
- error C2440 “static_cast” 无法从“void (__thiscall CPppView )(void)”转换为“LRESULT (__thiscall
- error C2440: “static_cast” : 无法从“void (__thiscall CMainFrame::* ) (NMTOOLBARA *,LRESULT *)”转换为“void
- error C2440: “初始化”: 无法从“const char [8]”转换为“const wchar_t *” 1> 与指向的类型无关;转换要求 reinterpret_ca
- 通过findViewById()方法从layout中获取view并进行相应的转换时提示:"Cannot cast from View to AutoCompleteTextView"的解决办法!
- error C2440 “static_cast” 无法从“void (__thiscall CPppView )(void)”转换为“LRESULT (__thiscall
- C++类型转换运算符: static_cast<>,reinterpret_cast<>,dynamic_cast<>, const_cast<>
- error C2440: “static_cast”: 无法从“LRESULT ”转换为“LRESULT
- “无法将类型"string"转换为"char"”?