学习了N本关于com和activex的书,得出以下的结论,不知道是否完全正确,大家来看看

pagou 2010-01-02 10:22:52
以下是我看了N本com和ole和activex的书籍资料以后产生的理解,可能有理解不准确的地方,大大看看呢。


接口和组件对象的理解.
一个组件的说法不正确,正确说法应该是一个组件对象,这个概念是对象,只不过是一种特殊的对象,是可以以二进制形式分发的,称为组件对象。
一个dll中可以有N个组件对象。每一个对象可以有N个接口
例如adodb是一个库,里面有adodb.connection对象,也有adodb.recordset对象,但是adodb这个库可能存在于msado15.dll中,为什么说可能呢。因为用progid访问adodb.connection,到底创建的是哪一个对象,要看注册表中默认设置的是哪一个版本的ado.因为mdac有很多个版本(微软数据访问组件目前已经到了2.8版)


自动化就是支持了idispatch接口的组件对象。
支持了自动化的组件对象就必然是晚绑定的组件对象。
vb6只能使用支持自动化接口的组件对象vb6本身就是一个支持自动化接口的组件对象,在vb的对象管理器中就可以看到vb库里面的组件对象和枚举定义,也可以看到vba库的组件对象和枚举

vb6的引用和部件的区别就是,引用是指include一个tlb库,可以使用里面的组件对象,这种对象是除activex控件以外的任何组件对象,部件的意思是include一个activex控件库,可以在form上生成一个可视可不可视的activex控件。

idispatch接口的功能就是将软件的几百上千个函数暴露出来,让客户通过接口访问,这些函数的调用是间接的,并不是象调用组件对象的接口函数一样简单。也就是说支持idispatch的组件对象,他的vtbl实际上就是那么几个固定的接口函数,但是确能调用对象内部的几十个上百个函数。普通的组件对象只能调用接口规定的几个函数,例如queryinterface,addref,release等,没有任何多余的函数可以调用。

组件对象的要对外发消送息必须要用事件,也就是连接点功能。
实现连接点功能是很复杂的,要在客户端和组件对象中都加入一个微型组件对象,与proxy/stub功能有一些类似。

线程模型:
套间线程就是一个对象一个线程,或者叫sta,多套件线程模型mta的意思就是一个套间中有多个线程多个组件对象,但是跟主线程还是分开的,意思就是说mta模型实际上就是2个套间,除了主套件(主线程)以外的那个套件里面有N个线程。跨套间调用必须要用到proxy/stub机制,如果主线程中的函数要调用另一个套间中的某个对象的某个接口,就要用到proxy/stub机制。

如果一个进程中除了主线程以外还有N个辅佐线程,但是只有一个套间,没有第二个套间,(也就是只调了一次com库初始化函数),并且这个N个线程还创建了N个组件对象,那么这些对象只能自已维护线程安全,这些对象可以完全自由互相访问,不需要proxy/stub,性能很好。

一个进程可以有N个套间,每个套间中可以有一个组件对象。但是一个进程中只有一个mta套间,这个套间中可以有N个线程N个对象,并且也是一个线程一个组件对象。

com+的意思可以理解成一种企业级组件对象管理器,与一般的activex控件完全不相关,也就是说,只有在设计组件对象的时候,明确点击支持com+的功能,才可以在生成dll以后,让com+来管理。

如果一个组件对象在设计时支持com+的功能的话,那么客户使用这个组件对象就必须是进程外的模式来使用,因为com+接管了组件对象的运行与监控。

普通的进程内com组件对象如果没有明确支持com+特性,是与com+无任何一点关系的,因为进程内组件对象完全由本进程管理它的生存与毁灭。
...全文
118 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgcbj 2012-03-31
  • 打赏
  • 举报
回复
推荐几本书啊
wshcdr 2010-01-05
  • 打赏
  • 举报
回复
说得对
飞天赤狐 2010-01-04
  • 打赏
  • 举报
回复
楼主所言,经查基本属实
leer168 2010-01-04
  • 打赏
  • 举报
回复
刚学COM,不知道呢还
幸福官 2010-01-04
  • 打赏
  • 举报
回复
正在学习COM,帮顶
pagou 2010-01-03
  • 打赏
  • 举报
回复
没人评论一下是否有不对的地方嘛。
雪影 2010-01-03
  • 打赏
  • 举报
回复
善于总结是个不错的习惯
帮顶

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧