COM线程模型 - STA接口

COM里面的线程模型应该是COM里面比较困难的一部分了,我自己也是花了很多时间,而且也还不是很懂。最近又重新看了一下线程模型,为了加深自己的学习,特地写下这篇文章。

MSDN上有很多信息,比如

http://msdn.microsoft.com/en-us/library/windows/desktop/ms680112(v=vs.85).aspx

这里面就有很多关于STA的信息。建议仔细阅读,特别是新手。

STA规则

这里罗列几条重要的规则:

Rules for single-threaded apartments are simple, but it is important to follow them carefully: 
• Every object should live on only one thread (within a single-threaded apartment). 
• Initialize the COM library for each thread. 
• Marshal all pointers to objects when passing them between apartments. 
• Each single-threaded apartment must have a message loop to handle calls from other processes and apartments within the same process. Single-threaded apartments without objects (client only) also need a message loop to dispatch the broadcast messages that some applications use. 
• DLL-based or in-process objects do not call the COM initialization functions; instead, they register their threading model with the ThreadingModel named-value under the InprocServer32 key in the registry. Apartment-aware objects must also write DLL entry points carefully. There are special considerations that apply to threading in-process servers. For more information, see In-Process Server Threading Issues. 

简单翻译一下:

STA的规则很简单,但是需要小心的遵守这些规则: 
• 每一个STA COM 对象只能存在于一个线程中 (在一个STA套间内)
• 每一个线程都需要初始化COM库
• 在套间之间传递com对象指针的时候,需要列集(marshal)
• 每一个STA套间必须拥有一个消息循环,用来处理从其他进程或者当前进程的其他套间过来的消息。(后面一句没有理解,就不翻译了,以免误导。)其实,我个人感觉如果一个STA套间创建了一个COM对象,只要这个COM对象不传递到其他线程,消息循环是可以省略的。但是如果COM对象需要传递到其他进程,那么就必须创建一个消息循环。
• COM对象本身并不需要调用COM的初始化函数;相反,他们会把他们的线程模型放在注册表中的一个叫做InprocServer32的键下面。后面的也不是很了解。以后弄明白了再说。

还是用几个例子来说明吧。

简单的STA COM组件

先来创建一个VS solution,很简单,里面有2个工程,一个是console,一个是ATL工程。看上去就像:

然后给MyCom增加一个接口,其实就是用ATL向导来做的,很简单,但是还是截一些图吧,这样更加形象。

图1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值