简单看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的内部函数~
- 简单看AfxOleInit()的内部工作~~
- 神奇的afxoleinit()
- AfxOleInit
- AfxOleInit()
- AfxOleInit
- 关于Unity内部脚本如何工作的简单概览
- 从一个简单的内核看操作系统的工作
- AfxOleInit和OleInitialize的区别
- AfxOleInit 和CoInitlize的区别
- AfxOleInit 和CoInitlize的区别
- AfxOleInit 和CoInitlize的区别
- CoInitialize与CoInitializeEx,AfxOleInit()的不同
- CoInitialize与CoInitializeEx,AfxOleInit()的不同
- 关于 AfxOleInit进行初始化的问题
- epoll的内部实现 看了就会懂
- CoInitialize与CoInitializeEx,AfxOleInit()的不同 控制台程序中AfxOleInit失效原因
- Tapestry内部工作原理的笔记
- CPU的内部架构和工作原理
- SAP预留(转)
- 李开复写给中国大学生的七封信【3/7】
- Linux查看文件句柄占用多的进程
- 李开复写给中国大学生的七封信【4/7】
- 李开复写给中国大学生的七封信【5/7】
- 简单看AfxOleInit()的内部工作~~
- Castle.ActiveRecord 使用 存储过程 返回实体类
- 李开复写给中国大学生的七封信【6/7】
- Drawable、Bitmap、byte[]之间的转换问题
- 还没有脱离Revit平台运行的Revit插件
- ORACLE建立恢復目錄CataLog
- 索引失效问题
- 李开复写给中国大学生的七封信【7/7】
- 解析SQL Server 2000的“设备激活错误”