Chinaunix首页 | 论坛 | 博客
  • 博客访问: 313037
  • 博文数量: 174
  • 博客积分: 3061
  • 博客等级: 中校
  • 技术积分: 1740
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-04 22:43
文章分类

全部博文(174)

文章存档

2011年(54)

2010年(14)

2009年(30)

2008年(26)

2007年(27)

2006年(23)

我的朋友

分类: WINDOWS

2008-12-13 22:28:05

一般经典的书籍以及文档,你都可以发现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当然最好。
阅读(759) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~