MFC通用控件的初始化
2008-01-17 21:36:55 来源:WEB开发网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,这个在函数的注释里说的很清楚,是为了适应各种不同的链接选项而已.
水平有限,如有不当之处,请大家指正。
更多精彩
赞助商链接