_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的内部函数~