CoUninitialize进程内COM对象创建规则

根据线程模型划分,进程内COM组件分为四类:Single,Apartment,Free,Both

COM套间类型为两类:STA和MTA,STA是单线程套间,只能运行一个线程,但是一个进程内可以创建多个STA,STA总是与一个线程相关联,其中第一次创建的STA通常成为主STA(Main STA);MTA是多线程套间,一个进程内只能有一个MTA,但是MTA允许运行多个线程。

一个线程要进入到STA中还是MTA中,是由线程内调用CoInitializeEx函数的第二个参数决定的。

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);进入到STA(相当于调用CoInitialize(NULL);)

CoInitializeEx(NULL, COINIT_MULTITHREADED);进入到MTA

注意:在不再需要的时候,调用CoUninitialize();退出套间,一般CoInitializeEx与CoUninitialize都需要成对调用,以释放COM占用的资源。

下面具体说说进程内COM对象的创建规则:

Single类型的COM对象只能在Main STA中创建,Main STA只有一个,所以该类型对象只能有一个实例(非STA线程中创建对象,将返回代理接口指针)。

Apartment类型的COM对象只能在STA中创建,但不一定要是Main STA,STA可以有多个,所以该类型对象可以有多个实例,需要注意的是,不同的STA中的COM对象相互调用属于跨套间调用,需要列集和散集,不能直接传递对象指针(每个STA中创建对象,都返回真实接口指针。)。

Free类型的COM对象只能在MTA中创建,MTA只能有一个,第一次某线程调用CoInitializeEx(NULL, COINIT_MULTITHREADED);时,COM负责生成一个MTA,之后的线程调用CoInitializeEx(NULL, COINIT_MULTITHREADED);则不创建MTA,而直接进入MTA。MTA可以允许多个线程运行,所以该类型对象可以有多个实例,多个实例同属于一个套间,相互调用可以直接传递对象指针。

Both类型的COM对象,顾名思义,既可以在STA中创建也可以在MTA中创建。


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

其他文章http://blog.csdn.net/ynb119/article/details/4965781对single apartment free both的行为描述的比较简单明了

COM与套间(Apartment)之我见


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值