客程象模型合表 的疑惑 , 看看@@
http://myweb.fcu.edu.tw/~d9147897/com.JPG
中色的字 的合 , 何可以 "直接 "使用而不需 PROXY/STUB ?
STA STA 不是需要 PROXY/STUB ? 何途中可以直接 ?
困有多年了~~ 大解惑..
在此小弟先磕致.
ps:中源 http://www.icst.pku.edu.cn/course/CompCourse2001/PDF/06.pdf
[解决办法]
色的字是因不是於同一套 "apartment <-> Main STA " 和 "apartment <-> 非Main-STA "
何能示 "直接 " ?
--------------------------------------------
他只说了这些看不出来是不是在同一套间, 当COM对象和客户线程的线程模型(Threading Model)不兼容时, 就不会在同一套间了. 线程通过CoInitialize, 或CoInitializeEx来确定它的线程模型.
例如进程的第一个线程T1调用CoInitialize来将自己放入MAIN STA中, 这时一个IN-PROC Server被加载进来, 且它的Threading Model = Apartment, 那T1和COM对象就是直接访问了, 如果又有一个线程T2调用CoInitialize, 那T2进入自己的套间, T2与COM之间通过PROXY/STUB通信, 利用下面的RPC LAYER, 如果使用了Free Threaded Marshaler, 就可以绕开RPC, 所以有点 "直接 "的意思.
不知图中是否是这个意思
[解决办法]
Apartment 说明标明为单元(套间)线程(STA)管理模式,拥有该标识的组件可以在客户程序中的任何STA(单线程单元(套间),用CoInitialize(NULL)初始化COM库)中运行,而不仅仅是在主STA(主线程用CoInitialize(NULL)初始化COM库),组件要求的管理模式正好与客户单元一致,这时组件就直接在客户的单元创建,即然在客户与组件都在同一个单元中,当然可以直接访问,如果拥有Aparment标识的组件,而客户程为多线程单元(MTA,用CoInitializeEx(...)初始化COM库),侧此时组件是在COM单独创建一个STA中创建,而并非在客户的STA中创建,即组件与客户程不在同一个单元,即要COM提供PROXY/STUB访问