今天看潘爱民老师的《COM原理与应用》一书,讲到套间线程和自由线程。其中说:“如果其他线程中的代码要调用属于这个套间线程的COM对象的成员函数,则它不能直接调用,而要通过代理/存根模块进行间接调用”,还给了一个理由说是因为虽然两个线程在同一个进程地址空间中,但它们使用不同的堆栈。接着又说在自由线程中调用可以直接进行。 这里为什么会有这种区别?我想不同的堆栈应该不是主要原因吧。

解决方案 »

  1.   

    不同地堆栈? 是不同地线程局部存储区吧。 COM原理与应用这本书我没看,看了一下目录觉得有些空泛, 不如看MS
      

  2.   

    建议你还是看看 essential com,  基本地概念讲的很详细, 书定价差不多, 水平差地就 呵呵
      

  3.   

    essential com确实不错
    不过潘爱民老师的〈COM原理与应用〉同样是经典!
    至少在我看来,比INSIDE COM以及其他一些COM的书要好多了!楼主的所谓地址栈,应该是TLS
      

  4.   

    不会吧 inside com这么经典的书拿来和COM原理与应用
    这种书比较!? 呵呵 你是逗呢吧。 听说潘这本可没少从
    inside com抄内容。 ^_^
      

  5.   

    潘老师的那本书是一本理论性很强的书,书中例子等都进行了很大压缩
    抄内容这种说法不科学吧?? 如此说来,候SIR的《深入浅出》岂不是成了MSDN的一小部分内容的翻版? :)
    或许INSIDE COM入门还是不错,COM原理与应用就比较深入了。
      

  6.   

    候SIR的《深入浅出》是MSDN的一小部分内容的翻版!!
      

  7.   

    和堆栈没什么关系,主要是用来保证多线程中COM对象的线程安全问题,其他线程调用套间线程中的COM对象的成员函数要通过proxy间接调用,proxy通过套间线程中的windows消息队列来串行化函数的调用,以此来保证线程安全。
    如果是自由线程的话,则由COM对象自己来保证线程安全,所以其他线程可以安全的调用COM对象的函数。
    所以结论就是:套间线程的COM对象由COM来保证线程安全,自由线程的COM对象由对象自己来保证线程安全。另外需要注意的一点是,COM对象只能创建在与他的线程模型相匹配的套间里,否则就要通过proxy来间接调用。
      

  8.   

    我想潘老师的话还是有一定道理的。以前有人问过进程内当线程和对象处于不同套间时,是否可以直接调用的问题。后来我调试了一下,发现如果直接调用的话,出错是偶尔性的,如果在对象的方法中调用了某些系统API的话,在调用这些API后会改变保存在线程堆栈中的EIP或EBP等,最后导致出错。但是如果线程和对象处于同一套间时,也就是通过代理/存根模块进行间接调用,调用对象方法,这个线程的堆栈就不会被破坏。ms提出的这个套间的概念本来十分抽象,也没有具体的文档,即使essential com也只是在逻辑上进行了说明。ms原本的意思也就是让我们只要明白逻辑上的概念就行了:当线程和对象处于同一套间时可以直接调用对象,否则必须列集!
      

  9.   

    看看<<essential com>>,关于department的问题讲的比<<COM原理与应用>>多