套間有兩種類型:
1>單線程套間 STA
2>多線程套間 MTA
3>臨介區(qū)套間 RTA(未來可能會新增)
其中 單線程套間 在一個進(jìn)程中可以有多個.
而 多線程套間 在一個進(jìn)程中只能有一個.
單線程套間 與相關(guān)的線程是1對1的關(guān)系.
多線程套間 與相關(guān)的線程是1對多的關(guān)系.
一般情況下 套間 與 套間之間防問,都需要進(jìn)行序列化處理.
而如果在同一進(jìn)程下 的 單線程套間 防問多線程套間COM會自動進(jìn)行優(yōu)化處理.
單線程套間應(yīng)該有消息循環(huán),去把對它們的調(diào)用轉(zhuǎn)成序列化.
在同一進(jìn)程的情況下:
STA是通過把調(diào)用轉(zhuǎn)成 消息再由擁有該STA的線程去處理.
MTA則是可以直接調(diào)用.
RTA與STA類似,但它的實現(xiàn)方式是為調(diào)用加把鎖,然后其它套間調(diào)用它的時候就鎖住。
與STA不同的是調(diào)用在RTA中的對象是發(fā)起調(diào)用的那個線程,而不是擁有RTA的那個線程。
在不同進(jìn)程下:
所有調(diào)用都會通過 代理\存根 進(jìn)行序列化處理
進(jìn)程外:
CoMarshalInterface
CoUnmarshalInterface
CreateStreamOnHGlobal //創(chuàng)建與獲取內(nèi)存流
GetHGlobalFromStream
進(jìn)程內(nèi)用的簡化函數(shù):
CoMarshalInterThreadInterfaceInStream
CoGetInterfaceAndReleaseStream
聲明為Free的COM對象,為什么在本地STA套間中訪問會慢些?
COM把所有細(xì)節(jié)問題都集結(jié)到一個點上:如何正確的獲取接口?'
代理接口指針的列集會有問題,因此引入:
GIT Global Interface Table
IGlobalInterfaceTable
posted on 2009-01-12 11:03
鹿哥 閱讀(442)
評論(0) 編輯 收藏 引用 所屬分類:
COM