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

全部博文(174)

文章存档

2011年(54)

2010年(14)

2009年(30)

2008年(26)

2007年(27)

2006年(23)

我的朋友

分类: WINDOWS

2008-11-13 22:16:10

今天发现ww中sdkobjectcollection 以及aepquery,queryres 这几个free对象使用时候有些不解。
 
不解主要是因为碰到了“blog com线程重入问题"所碰到的困扰,这个也反映了实际上对于com的了解还是不够
深入。
 
先解释一下场景。
 
1. sdkobjectcolletion 对象free com,被创建于aparmtent,CPluginMgrV2::_updatepluginfofromsvr.
 然后通过com 方法调用传递给另外一个comaepquery, 而后者也是一个com,也是free com.
spAEPQuery->GetPluginInfo(spAppIDList)。
 
2. 而后者在拿到com后,启动了一个线程,并且将线程初始化为multithread apartment, 然后将sdkobjectcollection 作为参数传递入.
 
3. 在经过一段处理后,aepquery-thread 重新创建了一个sdkobjectcollection 然后填充入一些 item,这些item是apartment , 这个地方对这些item进行了marshalling。
 
4. 然后通过发送消息的方式传递回了最初发起的调用者线程,也是gui main thread.
 
 
当然这个过程实际上都是ok,而我的困惑,主要是遗忘了一些com的事实,现在回头作了一些验证,发现基本能够理解。
 
1. sdkobjectcolletion  被创建于aparmtent ,实际上创建出了一个proxy对象,而这个proxy对象通过方法GetPluginInfo ,调用后,在被调用者端已经变成了真实的对象指针,因为spAEPQuery同为mta对象,运行于自己的线程,而这个线程mta(com线程)。
 
2. GetPluginInfo 方法启动了一个工作线程,这个线程也初始化为mta,因此这就解释了为什么spAppIDList能够被直接调用,不会出现问题。
 
3. GetPluginInfo 处理中间创建了一个结果sdkobjectcolletion  ,由于sdkobjectcolletion  是mta对象,因此创建出来的是真实对象。
 
4. iteminfo 被创建于mta但是本身是sta,因此进行了列集。
 
5. 最后传回gui后,由于结果sdkobjectcolletion  是真实对象,因此直接访问没有问题,而item通过散集后访问也同样没有问题。 不过需要说明的是,由于iteminfo 标记为apartment 因此实际上在main gui中访问它实际上也是通过跨越套间访问的,是main sta对普通sta的访问,通过这儿可以看出,可以对queryres进行优化,就是将其修改为free or single.
 
 
阅读(775) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~