描述:
看了关于IMarshal 和 GIT的介绍 有几个问题请教:
我理解COM的特点就在于巧妙的把对象和接口分离开来 形成一种可复用的标准 而IMarshal接口实际上实现了对象的跨进程传递 我不明白的就是怎么有个GIT ? 这个GIT是哪里来的 ? 是哪里实现的? 没它在实现IMarshal接口的条件下一样不影响COM对象的访问啊 而且这个GIT怎么就可以保证传递的局部指针是有效的呢?
不明白 请高手指点 多谢
解决方案1:
刚刚看了些COM 说说我的理解 :
首先:GIT和Marshal的目的是一样的,都是要实现接口对象跨进程传递。
他们的不同在与使用的方法:Marshal是序列化接口对象,使用以下两个接口函数:
MarshalInterface()和UnmarshalInterface()(可以查看MSDN)。要求是必须实现IMarshal接口
Class Itr : public IMarshal .....
{ ........ }
GIT是全局接口表 在本套间可以将接口指针注册在GIT中 然后在套间外程外从GIT中散列接口指针,这就是所谓的FTM.它的好处就在于你可以不必关心你不需要的东西,而关注实现就行。
IMarshal接口实际上实现了对象的跨进程传递--这句话应该说成imarshal实现了对象的接口的跨套间(apartment),git应该是一张表,这个在《com本质论中》应该描述的比较清楚,偶有点忘了。
您可能想查找下面的文章:
- 请问CoMarshalInterface是根据什么来确定是否要为一个对象建立一个存根管理器
- IMarshal
- 请教专家被包容和被聚合时是否需要列集Marshal的问题
- 是否可以通过CoMarshalInterThreadInterfaceInStream获得从另外一个线程产生的接口?
- CoMarshalInterThreadInterfaceInStream传递一个特殊的IDispatch
- 跨套间marshal组件指针,用其返回其他组件对像出错!
- 跨套间marshal来的对像指针查地址不为空,但是
- 有关CoGetInterfaceAndReleaseStreamunmarshal的问题
- CoMarshalInterThreadInterfaceInStream只能用于实现了IDispatch的组件?
- 手工Marshal不成功,函数调用hang住了请帮我看看