今天发现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.
阅读(685) | 评论(0) | 转发(0) |