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. Mac下安装 php+nginx+mysql 开发环境

    一.mysql安装 mysql是安装最简单顺利的 1. 首先去官方网站下载Mac适用的MySQL的dmg包 下载页面 选择图中最下方的dmg包下载进行安装 安装完成后 MySQL的安装目录为/usr/ ...

  2. HTML&CSS基础学习笔记1.18-表格的边框

    今天的内容比较简单~来看看HTML里表格的边框是怎么设置的吧 表格的边框 前面为了方便观察表格单元格的情况,我们给<table>加了border属性.<table>的borde ...

  3. python文件_读取

    1.文件的读取和显示 方法1: f=open(r'G:\2.txt') print f.read() f.close() 方法2: try: t=open(r'G:\2.txt') print t.r ...

  4. FileOutputStream

    OutputStream: FileOutputStream BufferedOutputStream 缓冲输出流 package file; import java.io.File; import ...

  5. linux内核学习之一:环境搭建--安装Debian7.3

    本系列文章假设读者已对linux有一定的了解,其实学习linux内核不需要有很深的关于linux的知识,只需要了解以下内容:linux基础知识及基本shell命令:现代操作系统的基本概念:C语言和gc ...

  6. Struts2学习笔记--Struts例子及开发流程

    参考资料:http://blog.csdn.net/hntyzgn2010/article/details/5547753 http://chenlh.iteye.com/blog/464341 入门 ...

  7. Scala学习笔记--Akka

    待完成 http://www.gtan.com/akka_doc/ http://my.oschina.net/mingdong/blog/297972 http://www.jdon.com/con ...

  8. Lintcode--009(单词切分)

    http://www.lintcode.com/zh-cn/problem/word-break/ 单词切分 给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词. ...

  9. cf C. Find Maximum

    http://codeforces.com/contest/353/problem/C 先预处理前i个数的和,然后找到第一个出现的1,然后变成0后的和与目前的和比较,如果大就更新. #include ...

  10. 数据结构&&算法基础知识

    写本篇主要是为了将基础知识梳理一遍,天天加一些基本东西,以后复习时可以返回来看看. 数据结构&&基础算法: 基本算法: 二分查找 二叉树: 二叉树的各种遍历 位操作: 排序: 排序算法 ...