AfxOleInit()和::CoInitialize(NULL)区别
来源:互联网 发布:厌胜术 知乎 编辑:程序博客网 时间:2024/05/27 16:40
转载自:http://blog.csdn.net/zhoubl668/article/details/4139933
OLE是建立在COM之上的技术,层次比COM要高。AfxOleInit()调用的是OleInitialize(),而OleInitialize()除了调用CoInitializeEx()来初始化COM库外,还进行一些其它的操作,这些操作对OLE应用来说是必须的,这些OLE应用包括:
(1)Clipboard;(剪切板)
(2)Drag and drop;(拖放功能,就像可以将 .dsw文件直接拖放到VC++中)
(3)Object linking and embedding(现在的OLE,已不再仅仅是Object linking and embedding的概念);
(4)In-place activation;(???,还没碰到过)
与AfxOleInit()对应的是,AfxOleTerm()。
CoInitialize和CoUninitialize必须成对使用,后者不必。
AfxOleInit()和AfxOleTerm()其实也是需要成对的,但是,在你的程序中,AfxOleTerm()可以不出现,这是因为,MFC已经帮你做好了(有兴趣的话,你可以仔细研究一下CWinThread::m_lpfnOleTermOrFreeLib,而CWinApp是从CWinThread继承的)。
////////////////////////////////////////
//以下是AfxOleInit的源码
--------------------------------------------------------------------------------
BOOL AFXAPI AfxOleInit()
{
_AFX_THREAD_STATE* pState = AfxGetThreadState();
ASSERT(!pState->m_bNeedTerm); // calling it twice?
// Special case DLL context to assume that the calling app initializes OLE.
// For DLLs where this is not the case, those DLLs will need to initialize
// OLE for themselves via OleInitialize. This is done since MFC cannot provide
// automatic uninitialize for DLLs because it is not valid to shutdown OLE
// during a DLL_PROCESS_DETACH.
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
TRACE1("Warning: OleInitialize returned scode = %s./n",
AfxGetFullScodeString(sc));
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();
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;
}
可见,AfxOleInit()主要是封装了OleInitialize(),而OleInitialize内部调用了ConInitialize
OleInitialize比ConInitialize多了以下支持:
Clipboard
Drag and drop
Object linking and embedding (OLE)
In-place activation
如果你不需要这些附加功能,就用CoInitialize或CoInitializeEx.
///////////////////////////////////////////////////////////////////////////////////////////
多线程问题的
AfxOleInit实际上调用了OleInitialize,虽然它在内部也调用了CoInitializeEx,但它只能处理单线程,这是AfxOleInit和CoInitialize 主要区别:
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.
Once the concurrency model for an apartment is set, it cannot be changed. A call to OleInitialize on an apartment that was previously initialized as multithreaded will fail and return RPC_E_CHANGED_MODE.
(上面这段话似乎涉及到了COM中的多线程模型)
所以,你最初调用AfxOleInit()失败,就是因为你的程序在多线程的状态
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别(转载)
- AfxOleInit()和::CoInitialize(NULL)区别(转载)
- 初始化COM-----------------------AfxOleInit()和::CoInitialize(NULL)区别
- CoInitialize()和AfxOleInit()区别
- AfxOleInit()和::CoInitialize(NULL)区别及多线程中使用
- OleInitialize、CoInitialize、CoInitializeEx和AfxOleInit()区别
- OleInitialize、CoInitialize、CoInitializeEx和AfxOleInit()区别
- OleInitialize、CoInitialize、CoInitializeEx和AfxOleInit()区别
- OleInitialize、CoInitialize、CoInitializeEx和AfxOleInit()区别
- address_space 与 radix tree
- XML(DOM)解析
- javascript call callee
- gaga
- oracle/db2/sqlserver/sybase/mysql 数据库取前几条数据写法
- AfxOleInit()和::CoInitialize(NULL)区别
- 初学单片机的一些概念
- Oracle Null 与 in, exists 的关系说明(not in 查不到结果)
- IIS 配置文件
- Const,Const函数,Const变量,函数后面的Const (zz)
- jQuery dialog 的autoClose
- cocos2d中的schedule使用
- 【数字图像处理】图像可视化对数增强 直方图及其均衡化
- HDU 4003 Find Metal Mineral