一般经典的书籍以及文档,你都可以发现Apartment对象被创建之后,如果直接用于另外一个线程,
那么不管使用线程是何模型,那么对此对象的使用,应该是调用直接失败。
或许你认为调用会成功,但是实际上跨越了两个apartment因此需要做marshaling/unmashaling.
我今天的发现,上述两种说法都错。
我有个com对象,tm=apartment,创建于一个tm=apartment的线程,然后对象指针,作为参数传递到了
另一个线程,令一个线程的tm=any。
结果我发现,对此对象的调用直接在调用进程完成。
1. 我在xp下使用manifest side by side 方式验证。
2. windows 2k 下使用注册表注册验证。
均证明这个结果是ok的,翻过来说明经典书籍的错误,或许我想微软优化了这个过程。
又过了几天,得到了如下这个blog的文章。
知道了,上述认为的优化,实际上是存在风险的。
简单来说,因为在一个同对象tm兼容的线程内创建出的对象,估计类似于一种真实的对象,也就是说并不是
代理对象,因此拿到其它线程用也可以(直接在使用线程上下文进行调用),这反过来能够验证确实这是个真实对象。
但是从已经看到的一些资料来看,由于对象存在于套间中,因此如果此套件销毁了,那么可能存在一些异常情况,这就是为什么经典书籍均强调marshalling在跨越套间时候。
而这个实际上有待于进一步的挖掘,有source当然最好。
阅读(764) | 评论(0) | 转发(0) |