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. linux下面安装配置LAMP环境

    以centos下面为例.初学者.东西基本都是各个地方找来的.自己手写了一遍.应该印象会很深刻 首先切换到超级管理员模式 1.安装php 一路选择y就行了 安装一些php的扩展 yum -y insta ...

  2. MYSQL常见出错mysql_errno()代码解析

    如题,今天遇到怎么一个问题, 在理论上代码是不会有问题的,但是还是报了如上的错误,把sql打印出來放到DB中却可以正常执行.真是郁闷,在百度里面 渡 了很久没有相关的解释,到时找到几个没有人回复的 & ...

  3. Ubuntu 配置swftools(Ubuntu14.04)

    1.下载文件 wget http://swftools.org/swftools-0.9.0.tar.gz .tar.gz wget http://www.ijg.org/files/jpegsrc. ...

  4. 使用APMServ本地搭建多个网站

    October 27, 2014 使用APMServ本地搭建多个网站教程 把我写好的代码直接粘贴到 httpd.conf 文件的末尾.然后保存就可以了.代码如下: <VirtualHost *: ...

  5. JavaScript键盘事件全面控制代码

    JavaScript键盘事件全面控制,它可以捕获键盘事件的输入状态,可以判断你敲打了键盘的那个键,ctrl.shift,26个字母等等,返回具体键盘值. <html> <head&g ...

  6. C#实现窗体间的通信

    以下将窗体间的几种通信实现方式做一下罗列:首先新建一个窗体Form1,在其中放置一个Textbox.Button控件.再新建一个窗体Form2,其上放置一个Button控件.具体代码示例如下: //F ...

  7. Python新手学习基础之函数-return语句与函数调用

    return语句 return语句的写法是: return 表达式 return语句用于退出函数,选择性地向调用方返回一个表达式.return在不带参数的情况下,默认返回None. None是一个特殊 ...

  8. 容器 set

    SET 是个有序表!他会根据INSERT的数值自动排序! SET里面不可能出现相同的元素!SET在insert的时候会排重的! SET本质上是一种树结构,在检索上比链表快,插入比数组方便,但是不允许重 ...

  9. ie6兼容性

    文本重复Bug 在IE6中,一些隐藏的元素(如注释.display:none;的元素)被包含在一个浮动元素里,就有可能引发文本重复bug.解决办法:给浮动元素添加display:inline;. 躲猫 ...

  10. Lintcode--004(最小子串覆盖)

    给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 注意事项 如果在source中没有这样的子串,返回"",如果有多个 ...