描述:
谁能给我讲一讲sta重入是如何实现的,我看不懂《essential com》“通道偷取到调用者的线程,并把它放到一个内部的窗口消息循环中”,消息过滤器是在STA中运行吗?
解决方案1:
这个消息循环和普通用户界面线程中的消息循环是一样的,其实com的线程模型和windows线程模型就是一个东西。
所有这些都是针对跨套间调用来说的,最常见是进程外组建。
这里的套间并非你在客户端调用的CoInitialize创建的。他是由组建创建的,比如一个exe组件启动时,它调用CoInitialize创建这个sta套间。(只有存在两个以上套间,才有跨套间一说吗)
com认为sta内的对象(这是你负责编程部分)不保证线程安全,因此,com来提供这种并发保护。当来自线程池(由com创建,与我们编程无关)的线程(当然可能有很多个线程)中所包含的方法调用到达这个sta时,这个些法调用被转换为一个一个的消息,发送到消息队列,这样并发调用被串行化为一个消息队列,消息只能一个接一个的被处理,每个消息的消息处理函数对应该消息所代表的方法。
我们只需要指定组建的套间的类型就可以了,至于方法调用在组件所在com环境下如何被分配到线程池的某个线程中,由com本身来实现,很多书也有介绍。
当楼主调用CoInitialize时,COM运行时期库就创建了一个隐藏的窗口,并有其特定的消息处理函数,而楼主调用CoInitialize的线程必须实现一个消息循环,否则此线程中的所有COM对象都将不能获得调用(前提是发生跨套间调用)。
因此楼主可以试下,用一个简单的while来代替消息循环,那么此线程中的COM对象将无法执行客户端的调用(不过一定要发生跨套间调用,否则代理/占位不起作用)。