From: http://blog.csdn.net/zhoubl668/archive/2009/04/30/4139933.aspx

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()失败,就是因为你的程序在多线程的状态

AfxOleInit()和::CoInitialize(NULL)区别的更多相关文章

  1. memset与NULL区别

    memset与NULL区别 NULL与0 的区别 为什么强调一个malloc对应一个free 在一个结构体malloc,然后free,但是她的成员变量的malloc并没有free,还需要特别的free ...

  2. Java进阶(二十一)java 空字符串与null区别

    java 空字符串与null区别 1.类型 null表示的是一个对象的值,而并不是一个字符串.例如声明一个对象的引用,String a = null ; ""表示的是一个空字符串, ...

  3. >/dev/null 2>&1和2>&1 >/dev/null区别

    >/dev/null 2>&1和2>&1 >/dev/null区别 >/dev/null 2>&1 //会将标准输出,错误输出都重定向至/d ...

  4. C#中string.Empty ,"" , null 区别

    引言 String类型作为使用最频繁的类型之一,相信大家都非常熟悉,对于string赋予空值,通常有以下三种方式: String str1=null; String str2=””; String s ...

  5. SQL中空值与NULL区别

    很多人都有过这样的问题吧   在SQL中填充空值与NULL有什么区别 现在我以一个实例给大家分享一下自己的想法  恳请大家给予批评也指正 谢谢 创建一个监时表 CREATE TABLE #temp ( ...

  6. javascript 中 undefined 和 null 区别

    1.相同点 如果我们直接用 undefined == null  比较他们是相等的返回的将是 true. 2.区别 当我们用undefined === null 比较的时候最后返回的将是 false. ...

  7. JavaScript-undefined与null区别

    JavaScript中的null在其他编程语言中也很常见,但是JavaScript在设计的过程中null自动转换为0,为了更好表示空,这个时候undefined出现了,null通过typeof结果是“ ...

  8. MySQL的空值和NULL区别

    从本质上区别: 1.空值不占空间 2.null值占空间   通俗的讲: 空值就像是一个真空转态杯子,什么都没有,而null值就是一个装满空气的杯子,虽然看起来都是一样的,但是有着本质的区别.     ...

  9. 来理解undefined 和 null 区别

    之前虽然也知道这两个之间的区别,但是让我描述的话,感觉上还是说的不是很清楚.今天也详细看了一次这个知识点,现在来说说这两者间的区别. null: Null类型,代表“空值”,代表一个空对象指针,使用t ...

随机推荐

  1. 根据反射生成SQL语句

    /** * 基础查询语句 * 返回类型的属性字符串Sql * @author: InkYi * 修改时间:2016年5月11日 - 上午10:06:00<br/> * 功能说明:<b ...

  2. POST多个参数到Web API控制器

    交互基于Json的方式打包传递就不介绍了,主要设置请求头为 contentType: "application/json", //必须有 数据位Json格式的字符串,在服务器端定义 ...

  3. Ushare应用

    Ushare应用 Openwrt 系统功能强大,主要优势在于其开放性和可扩展性,Openwrt 安装ushare后,可将路由器变身为一个功能强大的家庭upnp流媒体服务器! 打开网上邻居,会显示发现u ...

  4. jquery 实现全选反选

    jquery代码 $(function () { $('#inputCheck').click(function () { if ($(this).attr("checked")) ...

  5. linux shell在while中用read从键盘输入

    系统是ubuntu 14.04 64bit,之前曾想安装Stream来玩dota2,但最终没成功.由于Stream只有32bit,安装Stream时也安装了大量32bit的库.删除Stream后,这些 ...

  6. web前端代码规范 - HTML代码规范

    Bootstrap HTML编码规范 本文转载自w3cschool. 由于bootstrap得到了世界的认可,因此,此规范用于规范html代码有一定的说服力. 交流qq群:164858883.欢迎各位 ...

  7. iphone真机开发流程之--证书申请

    一.申请 1.进入ios开发者中心 http://www.apple.com.cn/developer/ios/index.html 2.点击登录 输入用户名和密码(前提:已经有Apple ID,且花 ...

  8. 利用dedecms给近三天(或当天)发布的文章显示红色日期或加上new字或new小图片

    1)红色日期 <br>[field:pubdate runphp='yes'] <br>$a="<font color=red>".strfti ...

  9. ZigBee心电传输(一)

    第一次接触模拟的东西哈,也算是一次新的学习旅程以及对ZigBee的再一次探索吧. 首先是方案制定,以及采用芯片AD8232,这样节省了不少时间,把模拟的东西都搬到数字上了,不过还是需要学习不少模电知识 ...

  10. NYOJ128 前缀式计算 【栈】

    前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 先说明一下什么是中缀式: 如2+(3+4)*5这样的我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上 ...