AfxOleInit()和::CoInitialize(NULL)区别

作者: admin 分类: Windows api 发布时间: 2014-03-15 13:02 ė3,623 浏览数 6没有评论
文章转自王牌软件
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)

OLE是建立在COM之上的技术,层次比COM要高。AfxOleInit()调用的是OleInitialize(),而OleInitialize()除了调用CoInitializeEx()来初始化COM库外,还进行一些其它的操作,这些操作对OLE应用来说是必须的,这些OLE应用包括:
(1)Clipboard;
(2)Drag   and   drop;
(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.

所以,你最初调用AfxOleInit()失败,就是因为你的程序在多线程的状态



只回答业务咨询点击这里给我发消息 点击这里给我发消息

学习日记,兼职软件设计,软件修改,毕业设计。

本文出自 学习日记,转载时请注明出处及相应链接。

本文永久链接: https://www.softwareace.cn/?p=732

0

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">


Ɣ回顶部

无觅相关文章插件,快速提升流量