CoInitialize、CoInitializeEx都是windows的API,主要是告诉windows以什么方式为程序创建COM对象,原因是程序调用com库函数(除CoGetMalloc和内存分配函数)之前必须初始化com库。
     有哪些方式呢?单线程和多线程。
      CoInitialize指明以单线程方式创建。
      CoInitializeEx可以指定COINIT_MULTITHREADED以多线程方式创建。
      创建单线程方式的COM服务器时不用考虑串行化问题,多线程COM服务器就要考虑。
      在使用中,使用CoInitialize创建可使对象直接与线程连接,得到最高的性能。创建多线程对象可以直接接收所有线程的调用,不必像单线程那样需要消息排队,但却需要COM创建线程间汇集代理,这样访问效率不高。

注:新的应用程序应该调用CoInitializeEx而不是CoInitialize,一般是在 Dll 中使用 COM 才会需要使用的。

-----------------------------

对于每个使用com库的线程,CoInitializeEx 至少必须调用一次,通常也只调用一次。只要传递相同的并发标志参数,同一个线程多次调用CoInitializeEx也是允许的,但是后面的有效调用返回S_FLASE。 要在一个线程上合理关闭com库,每一次成功调用CoInitialize或者CoInitializeEx (包括任何返回S_FALSE的调用),都必须对应调用一次CoUninitialize。
注意:要使用CoInitializeEx必须在代码开始包含#define _WIN32_DCOM预编译命令
一 个线程,除了调用CoGetMalloc函数和其它内存分配(CoTaskMemAlloc, CoTaskMemFree,CoTaskMemReAlloc, and the IMalloc methods on the task allocationsupplied byCoGetMalloc),在调用任何其它com库函数前必须调用CoInitializeEx或者CoInitialize,,否则com库函数会返回CO_E_NOTINITIALIZED。
一旦线程并发模式被设置,就无法再改变。在线程上再次调用CoInitializeEx,传递与之前初始化调用不同的并发机制参数,函数将返回RPC_E_CHANGED_MODE 错误值。
如果并发模式没有设置dwCoInit参数,默认值取COINIT_MULTITHREADED。
在单线程单元创建的对象,只能从他们的单元线程中接收方法调用,因此调用是序列化的,而且只能通过消息队列(当调用win32函数PeekMessage或SendMessage)到达。
在多线程单元创建的com对象,必须能够在任何时候接收来自其它线程的方法调用。在多线程对象编码中,你可能会使用win32同步机制,譬如临界区、信号量、互斥等来实现并发控制,帮助保护对象数据。
当运行在中立线程单元的对象被STA或MTA线程调用时,该线程转为NTA。如果这个线程在后面调用CoInitializeEx,调用失败,返回RPC_E_CHANGED_MODE错误代码。
CoInitializeEx 提供与CoInitialize相同的功能,而且也提供参数显式指定线程的并发模式。CoInitalize当前实现是通过调用CoInitializeEx,并指定并发模式为单线程单元。今天的应用开发应该调用CoinitializeEx,而不是CoInitialize。
因为OLE技术不是线程安全的,函数OleInitialize调用用CoInitializeEx,并传入参数COINIT_APARTMENTTHREADED标志。因此,初始化为多线程对象并发的单元无法使用OleInitialze激活的特性。
因为没有办法控制进程内服务加载与卸载的顺序,因此不要在DllMain函数内调用CoInitialize,CoInitializeEx, 或 CoUninitialize。

CoInitializeEx 与CoInitialize的区别相关推荐

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

    OLE是建立在COM之上的技术,层次比COM要高.AfxOleInit()调用的是OleInitialize(),而OleInitialize()除了调用CoInitializeEx()来初始化COM ...

  2. 511遇见易语言API模块线程初始化com库(CoInitialize)

    首先了解一下com组件,这样我们才能明白初始化com库的作用,用到两个API:CoInitialize,CoInitializEX 一.什么是COM组件 1.COM是Component Object ...

  3. 易语言多线程大漠多线程初始化COM库

    一.什么是COM组件 1.COM是Component Object Model (组件对象模型)的缩写 2.COM组件是以WIN32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行代码组成. ...

  4. CoInitialize和CoUninitialize

    CoInitialize 编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! CoInitialize是Windows提供的API函数,用来告诉 Windows以单线程的方 ...

  5. ATL炒冷饭学习之三:CoInitialize/CoUninitialize

    一.CoInitialize CoInitialize是Windows提供的API函数,用来告诉 Windows以单线程的方式创建com对象.应用程序调用com库函数(除CoGetMalloc和内存分 ...

  6. [转]COM线程模型-套间

    [转]COM线程模型-套间 COM线程模型-套间 来源: http://blog.csdn.net/crybird/archive/2008/10/11/3057067.aspx 查找了好多资料,终于 ...

  7. CoInitialize和CoInitializeEx

    1.CoInitialize和CoInitializeEx的功能 CoInitialize是在当前线程初始化Com组件的函数,并且初始化为STA模式(单线程模式),一般新的程序建议使用CoInitia ...

  8. DirectX和DirectShow介绍和区别

    1.DirectX是什么 DirectX是微软推出的一套基于Windows系统的多媒体应用程式接口APIs函式.在开发中,DX分为两个部分,一个是运行库,通过DX编译出来的程式必须要有运行库的支持,另 ...

  9. 多线程调用系统COM组件的体会(CoInitialize)

    多线程调用COM组件的体会(CoInitialize) 调用任何COM组件之前,你必须首先初始化COM套件环境,即调用CoInitialize或CoInitializeEx.COM套件环境在线程的生存 ...

最新文章

  1. Redis主从复制(读写分离)
  2. Java多线程学习三十八:你知道什么是 CAS 吗
  3. 动态ip、静态ip、pppoe拨号的区别
  4. C++中继承和派生详解(公有、私有、保护继承的区别)
  5. CAM是利用计算机,利用DroidCam将手机摄像头打造成计算机摄像头
  6. python为csv文件添加表头_csv大文件分割以及添加表头
  7. 网络小说海外“走红”的启示
  8. 试题 算法提高 字符串跳步
  9. 信息系统开发方法-生命周期法
  10. 用Arduino做一个能发射水弹的遥控小车
  11. 将一个数的每一位都正序输出——简单算法
  12. PC - 解决 Logitech G HUB 无法开机启动
  13. 解决“你的设备不支持Google Play服务”而无法运行App的问题
  14. diary在matlab,在MATLAB中,命令“diary on/diary off”表示()
  15. 计算机LCG/PCG/MWC/XorShift等PRNG算法,以及V8中Math.random()、webkit中crypto等随机算法的实现
  16. android webview 找不到网页,webview loadUrl 显示“找不到网页”
  17. java内存设在哪里设置,java程序设置最大内存 在哪里设置java内存大小
  18. python尺与米的转换_opencv-python-学习笔记九(图像几何转换)
  19. python 访问sas 逻辑库_SAS岩论 | 在Jupyter Notebook中使用SAS
  20. 传谷歌计划将亚洲总部搬离上海

热门文章

  1. delphi 手机访问lan_WiFi6值得升级?华为荣耀旧手机网速翻倍?华为AX3 Pro最强评测!...
  2. 如何让 VSCode 打开文件始终在新标签页打开?
  3. 水墨飘香 国画徜徉——安利公益基金会之国画学习顺利开展
  4. 华为p8高配版android系统版本,华为P8的手机系统是什么?能升级安卓5.0吗?
  5. YAML 详解与实战
  6. React 父组件调用子组件中的方法
  7. 扫描件怎么转换成pdf文档?快来了解下手机扫描的方法
  8. 程序员也分三六九等?等级差异,一个看不起一个!
  9. 免费获取股票数据的方法(Tushare篇)__ Tushare调用股票数据
  10. 欧式复古英文字体_8位字体为现代计算机增加了复古感