简单看AfxOleInit()的内部工作~~

来源:互联网 发布:淘宝药房旗舰店靠谱吗 编辑:程序博客网 时间:2024/06/10 20:58
 

_AFX_THREAD_STATE* pState = AfxGetThreadState();
 ASSERT(!pState->m_bNeedTerm);    // calling it twice?

 if (afxContextIsDLL)
 {
  pState->m_bNeedTerm = -1;  // -1 is a special flag
  return TRUE;
 }

 // first, initialize OLE
 SCODE sc = ::OleInitialize(NULL);
 if (FAILED(sc))
 {
  // warn about non-NULL success codes
#ifdef _DEBUG
  TRACE(traceOle, 0, _T("Warning: OleInitialize returned scode = %s.\n"),
   AfxGetFullScodeString(sc));
#endif
  goto InitFailed;
 }
 // termination required when OleInitialize does not fail
 pState->m_bNeedTerm = TRUE;

 // hook idle time and exit time for required OLE cleanup
 CWinThread* pThread; pThread = AfxGetThread();
 ASSERT(pThread);
 pThread->m_lpfnOleTermOrFreeLib = AfxOleTermOrFreeLib;

 // allocate and initialize default message filter
 if (pThread->m_pMessageFilter == NULL)
 {
  pThread->m_pMessageFilter = new COleMessageFilter;
  ASSERT(AfxOleGetMessageFilter() != NULL);
  AfxOleGetMessageFilter()->Register();
 }
 return TRUE;

InitFailed:
 AfxOleTerm();
 return FALSE;

 

上面有两个东西:

API OleInitialize初始化Ole库,实质--OleInitialize calls CoInitializeEx internally to initialize the COM library on the current apartment. Because OLE operations are not thread-safe, OleInitialize specifies the concurrency model as single-thread apartment.

 

pThread->m_lpfnOleTermOrFreeLib = AfxOleTermOrFreeLib;设置释放的回调函数。


 if (bTerm)
 {
  AfxOleTerm(bJustRevoke);
 }
 else
 {
  // initialize _afxTickCount if necessary
  if (!_afxTickInit)
  {
   _afxTickCount = ::GetTickCount();
   ++_afxTickInit;
  }

  // only call CoFreeUnusedLibraries if one minute has gone by
  if (GetTickCount() - _afxTickCount > 60000)
  {
   CoFreeUnusedLibraries();
   _afxTickCount = ::GetTickCount();
  }
 }

主要的释放还是调用了 AfxOleTerm,里面还是调用了

CoFreeUnusedLibraries();
   ::OleUninitialize();这两个函数。

在程序中用API编程可以借鉴MFC的内部函数~

 

原创粉丝点击