现在的位置: 首页 > 综合 > 正文

CoUninitialize进程内COM对象创建规则

2013年01月18日 ⁄ 综合 ⁄ 共 1092字 ⁄ 字号 评论关闭

根据线程模型划分,进程内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)之我见

抱歉!评论已关闭.