CoUninitialize进程内COM对象创建规则
来源:互联网 发布:淘宝网斯凯奇女鞋 编辑:程序博客网 时间:2024/05/18 20:46
根据线程模型划分,进程内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)之我见
- CoUninitialize进程内COM对象创建规则
- 进程内COM对象的创建过程(AC5)
- 进程内COM对象的创建过程(AC5)
- COM对象创建过程总结(进程外和进程内)
- COM对象创建过程总结(进程外和进程内)
- COM对象创建过程总结(进程外和进程内)
- COM对象创建过程总结(进程外和进程内)
- 进程内COM组件的创建过程
- 进程内COM与进程外COM
- 进程内COM与进程外COM
- 进程内COM与进程外COM
- com进程内进程外组件
- Com对象创建过程
- 创建COM对象
- COM创建对象方法
- ATL 创建COM对象
- 创建COM对象
- 创建COM对象大全
- COM线程模型-套间
- 解决KMPlayer不能播放部分高清rmvb格式文件的问题
- 进程间通讯 —— 共享内存
- IO流技术_总结
- STM32开发板-环境篇
- CoUninitialize进程内COM对象创建规则
- 网络编程_总结
- java基础之一网打尽_总结的威力
- QT中的随机函数的用法
- 死锁_why
- 基于微博的股票市场预测(初步构想)
- 重新开始写blog
- COM, OLE技术概述
- 键盘扫描码