CoInitialize是什么

在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可能只是清除标志。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值