在msdn中对于CoInitialize的解释如下:

Initializes the COM library on the current apartment and identifies the concurrency(并发) model as single-thread apartment (STA). Applications must initialize the COM library before they can call COM library functions other than CoGetMalloc and memory allocation functions.

在当前单元上初始化 COM 库并将并发模型标识为单线程单元 (STA)。应用程序必须先初始化 COM 库,然后才能调用 CoGetMalloc 和内存分配函数以外的 COM 库函数。

New applications should call CoInitializeEx instead of CoInitialize.

新的应用程序应该调用CoInitializeEx而不是CoInitialize

在别人的博客上看到下面的说明:

CoInitialize并不装载com库,这个函数只是用来初始化当前线程使用什么样的单元。当使用这个函数以后,线程就和一个单元建立了对应关系。
线程的单元模式决定了该线程如何调用com对象,是否需要列集等
你可以看一下有关列集的资料,使用不同单元之间对象接口是通过列集来完成的。关于列集的实现,很多书上都有较详细的说明。
CoInitialize()并不会干扰客户和服务之间的通信,他所做的事情只是让线程注册一个单元,而线程运行过程中就必然在此单元中,就象我们每个活着的人,都一定属于某个国家一样。
需要强调的是,单元是com中用来解决并发调用冲突的很有效的办法。

Before calling any COM functions, a thread needs to call CoInitialize to load the COM infrastructure (and to enter an apartment). Once a thread calls CoInitialize, the thread is free to call COM APIs.

CoInitialize(0)让当前线程进入一个STA的Apartment…

自己在综合了各种说法,有如下理解:

COM是得到windows支持的一个特殊功能,提供方便、简单的对象编程模型。(我对此表示怀疑^0^)
CoInitialize、CoInitializeEx都是windows的API,主要是告诉windows以什么方式为程序创建COM对象。
有哪些方式呢?单线程和多线程。
CoInitialize指明以单线程方式创建。
CoInitializeEx可以指定COINIT_MULTITHREADED以多线程方式创建。

创建单线程方式的COM服务器时不用考虑串行化问题,多线程COM服务器就要考虑。
在使用中,使用CoInitialize创建可使对象直接与线程连接,得到最高的性能。创建多线程对象可以直接接收所有线程的调用,不必像单线程那样需要消息排队,但却需要COM创建线程间汇集代理,这样访问效率不高。

大概就这样了,CoInitialize对windows来说可能只是设置一个标志,让下面的CoCreateInstance创建不同的线程对象罢了,同理,CoUninitialize可能只是清除标志。

CoInitialize是什么相关推荐

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

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

  2. you're probably running inside a thread without first calling pythoncom.CoInitialize

    you're probably running inside a thread without first calling pythoncom.CoInitialize 后来在网上搜索,看到必须添加初 ...

  3. python 尚未调用 CoInitialize

    python 尚未调用 CoInitialize import pythoncom pythoncom.CoInitialize()

  4. CoInitialize和CoInitializeEx

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

  5. CoInitialize\CoCreateGuid\CoCreateInstance

    CoInitialize是Windows提供的API函数,用来告诉 Windows以单线程的方式创建com对象.应用程序调用com库函数(除CoGetMalloc和内存分配函数)之前必须初始化com库 ...

  6. Python多线程下调用win32com包相关问题:pywintypes.com_error: (-2147221008, ‘尚未调用 CoInitialize。‘, None, None)问题处理

    报错1: pywintypes.com_error: (-2147221008, '尚未调用 CoInitialize.', None, None) 场景: 我是用 flask 服务操作接收的请求,通 ...

  7. hr 0x800401f0 尚未调用 CoInitialize

    在Windows上编程总有一种想砸电脑的冲动! 用C++操作数据使用了一下操作: _ConnectionPtr pConnect = NULL; _RecordsetPtr pRecordset = ...

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

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

  9. OLE DB error occured. Code 80040E14h. CoInitialize has not been Called. 问题解决

    Delphi XE10.4 使用unidac连接sqlserver2008编程,上传服务器,出了标题错误. 一.原因分析 1.屏幕显示CoUnInitialize has not been call. ...

最新文章

  1. 林元庆创办的AiBee科技完成新融资,要赋能B端生意
  2. spring service 怎么拿到数据源信息_SSM(SpringMVC + Spring + MyBatis)中各层作用及关系Ⅰ...
  3. lazada开店平台费用都有哪些,产品如何来做定价?
  4. 共享内存 传一个类指针_C++指针
  5. 计算机网络rsa算法,计算机网络安全实验新报告--非对称密码算法RSA.doc
  6. mysql中depart_mysql 学习笔记
  7. 洛谷 P1309 瑞士轮 解题报告
  8. ansible file模块_Ansible: 检测文件是否存在的逻辑
  9. 谷歌联合学习的论文_Google的未来联合学习
  10. Linux常用初级指令介绍
  11. 从“五种权力论”说新人入职要点
  12. 鸟哥的linux私房菜 第五章
  13. linux下eclipse安装及快捷方式创建
  14. 直角坐标积分化为极坐标积分_将直角坐标系下的二次积分转换成极坐标系下的二次积分...
  15. mysql 创建表 create table详解
  16. 如何像Python高手(Pythonista)一样编程
  17. 免杀技术有一套(免杀方法大集结)(Anti-AntiVirus)
  18. 配置网络接口的“IP“命令
  19. 【PHP】进一法取整、四舍五入取整、忽略小数等的取整数方法大全
  20. Aras innovator几个小功能设定

热门文章

  1. 基于C语言的运动会成绩管理系统
  2. 使用 CSS 构建调色板:3 种方法
  3. 面试题 —— 前端如何进行SEO优化?
  4. 计算机概念总结5-阿里云的了解2-slb
  5. Android应用性能优化下电子书pdf下载
  6. 雪花算法-Snowflake Snowflake
  7. MySQL的索引结构为什么是B+树?
  8. 「首席架构师推荐」精选数据挖掘和机器学习软件列表
  9. 低代码,怎么秃然就火了?
  10. 一个简单的动作,让你的手机号码变成空号