阅读WTL 源码总是会遇到这一句, 不明白到底是啥.
// this resolves ATL window thunking problem when Microsoft Layer for Unicode (MSLU) is used
::DefWindowProc(NULL, 0, 0, 0L);
搜索到以下解释:
假如你的项目基于ATL或WTL框架,同时在Windows 95/98/Me系统上使用MSLU库,这里还一些额外的工作需要由你自己来完成。
1) 避免使用_ATL_MIN_CRT宏 -- 这个宏和MSLU不兼容
2) 在Windows的任务栏上会显示出错的名字-- 这是在ATL和WTL中使用::DefWindowProc和::CallWindowProc函数的问题。在程序运行的起始位置中增加下面代码就可以解决这个问题:
// 解决UNICOWS的thunk 问题
::DefWindowProc (NULL, 0, 0, 0);
• Tim Smith给出了详细的解释:
这个问题是,假如你在调用::DefWindowProc函数之前创建了一个ATL窗口,那么m_pfnSuperWindowProc指向的thunk[在起动]并没有解决地址问题。因而,当ATL把m_pfnSuperWindowProc传入::CallWindowProc同时传入了WM_SETTEXT消息,MSLU [它自身] 并不知道传入的已经是::DefWindowProc函数,因此额外做了字符串转换工作。如果在程序的开始位置调用::DefWindowProc,那么当ATL创建一个窗口并且把::DefWindowProc作为值赋给m_pfnSuperWindowProc变量,它就会保存MSLU函数的地址,那么MSLU中的::CallWindowProc函数意识到这个已经不需要作转化。通常,如果你要使用ATL/WTL,只需在你的程序运行的起始位置中增加这个代码就可以了。同时也要注意上面问题已经在WTL7.0中已经解决了,因此这个方法只对7.0之前的版本才起作用。