MFC通用控件的初始化
2008-01-17 21:36:55 来源:WEB开发网注意:
对Windows 95/98/Me来说,dll卸载的时候,在其中注册的所有窗口类会自动取消注册.这是自动进行的,并不需要你写下UnregisterClass的调用代码.
对Windows NT/2000/XP来说,当dll卸载的时候,在该dll中注册的窗口类并不会自动取消注册,因此必须在DllMain中人为的用代码调用unregisterClass. 否则一旦dll卸载后再次创建控件(因为没有反注册,系统认为窗口类仍有效),则该控件的窗口过程将指向无效的地址.
MFC中通用控件的初始化
MFC中采用了延迟加载的办法来初始化通用控件.这样,如果程序不使用任何通用控件,则不会加载comctl32.dll.如果使用了任何通用控件,则会在该控件的PreCreateWindow函数中初始化对应的通用控件.这就是使用depends工具查看一个使用了通用控件的MFC程序,一般都看不到有comctl32.dll存在的原因.这里是说一般,如果在你的代码中直接调用了两个初始化函数之一,就会正常链接到comctl32.dll。
要在MFC源代码中找到通用控件初始化的地方很简单,只要看看一个使用了通用控件的程序何时加载comctl32.dll就可以了.你可以调试这样一个程序,单步执行或每隔一段代码设置一个断点,然后每次执行后用工具看看exe是否加载了comctl32.dll模块,如此逐步缩小范围,很快就可以找到.查看exe在运行时包含模块的工具很多,比如IceSword或者windows优化大师带的一个进程管理工具都可以.
以控件syslistview32为例.MFC的包装类是CListView.
BOOL CListView::PreCreateWindow(CREATESTRUCT& cs)
{
return CCtrlView::PreCreateWindow(cs);
}
BOOL CCtrlView::PreCreateWindow(CREATESTRUCT& cs)
{
...
// initialize common controls
VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTLS_REG));
AfxDeferRegisterClass(AFX_WNDCOMMCTLSNEW_REG);
...
return CView::PreCreateWindow(cs);
}
AfxDeferRegisterClass会根据控件的种类不同,设置不同的参数,然后调用_AfxInitCommonControls,比如下面的代码:
更多精彩
赞助商链接