WEB开发网
开发学院软件开发VC MFC通用控件的初始化 阅读

MFC通用控件的初始化

 2008-01-17 21:36:55 来源:WEB开发网   
核心提示: init.dwICC = ICC_WIN95_CLASSES;fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WIN95CTLS_MASK);函数_AfxInitCommonControls完成实际的通用控件初始化.LONG

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,这个在函数的注释里说的很清楚,是为了适应各种不同的链接选项而已.

水平有限,如有不当之处,请大家指正。

上一页  1 2 3 4 

Tags:MFC 通用 控件

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接