内容摘要:介绍了MFC中通用控件初始化过程.
init.dwICC = ICC_WIN95_CLASSES;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WIN95CTLS_MASK);
函数_AfxInitCommonControls完成实际的通用控件初始化.
LONG AFXAPI _AfxInitCommonControls(LPINITCOMMONCONTROLSEX lpInitCtrls, LONG fToRegister)
{
...
HINSTANCE hInst = ::LoadLibraryA("COMCTL32.DLL");
...
(FARPROC&)pfnInit = ::GetProcAddress(hInst, "InitCommonControlsEx");
if (pfnInit == NULL)
{
...
}
else if (InitCommonControlsEx(lpInitCtrls))
{
...
}
FreeLibrary(hInst);
...
}
这里要说明一下,LoadLibrary和FreeLibrary成对出现,保持了对dll的引用计数不变.只有当对dll的引用计数从0变为1时,才会以DLL_PROCESS_ATTACH调用DLLMain函数,只有dll的引用计数从1变为0时,才会以DLL_PROCESS_DETACH调用DLLMain函数.上面的代码中,除了加载卸载DLL外,还有一次对dll中函数InitCommonControlsEx的调用,正是这个调用引起了系统额外的一次LoadLibrary的调用(注意,如前所述,MFC对这个DLL使用了延迟加载技术,因此,dll不会在程序一启动就被加载,而是延迟到第一次访问dll中的任何函数或数据).这个额外的调用使得对通用控件的注册并没有被后面的FreeLibrary取消.因此,程序在这以后就可以生成通用控件的窗口了.
至于,MFC为何时而采用直接调用,时而采用取函数地址的方法调用InitCommonControlsEx,这个在函数的注释里说的很清楚,是为了适应各种不同的链接选项而已.
水平有限,如有不当之处,请大家指正。
来源:vckbase 作者:南风 责编:豆豆技术应用
- VC/VC++按钮设计专题
- VC/VC++ 菜单专题
- VC/VC++ 工具条专题
- VC/VC++ 对话框教程
- VC/VC++ 报表教程
- VC/VC++ 控件
- VC/VC++ GDI
- Visual Studio 2008
- VC/VC++ MFC教程
- VC/VC++ QQ
- VC/VC++ Socket编程
- VC/VC++ 钩子编程
- TangramMini组件应用教程
- VC/VC++ 窗体
- VC/VC++ ADO 教程
- Windows CE 教程
- VC/VC++ DLL(动态链接库)编程
- VC/VC++ PDFlib
- VC与MATLAB编程
- VC/VC++ DirectShow 教程
- VC++入门视频教程
- VC/VC++ COM组件设计与应用
- VC/VC++ ATL
- VC/VC++ WTL
- VC/VC++ 定制调试诊断工具和程序
- VC/VC++ 进程
- VC/VC++ Win32
- VC/VC++ WMI
- VC/VC++ 消息
- 更多VC/VC++专题……