COM 与DLL有什么本质区别?

tang_12 2010-08-08 01:06:25
如题目,面试时经常被问到,但不知道如何问答
...全文
2419 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
tingsking18 2010-08-12
  • 打赏
  • 举报
回复
COM使用DLL给组件提供动态链接的能力
COM可以说是利用DLL动态链接能力最佳的方法,对于可用DLL解决的问题,都可以用COM组件更好地加以解决。
fangchao918628 2010-08-12
  • 打赏
  • 举报
回复
,一天老O(Office 项目的总工程师)和小B(VB 项目的总工程师)一起喝酒,老O向小B倾诉了他的烦恼:
老O:怎么能让我写的程序C,可以调用其它人写的程序S中的函数?(C表示客户程序,S表示提供服务的程序)
小B:你是不是喝糊涂了?让S作成 DLL,你去 LoadLibrary()、GetProcAddress()、...FreeLibrary()?!
老O:废话!要是这么简单就好了。问题是,连我都不知道这个S程序是干什么的?能干什么?我怎么调用呀?
小B:哦......这个比较高级,但我现在不能告诉你,因为我怕你印象不深。
老O:~!·#¥%……—*......
小B:是这样的,在VB中,我们制定了一个标准,这个标准允许任何一个VB开发者,把他自己写的某个功能的小程序放在VB的工具栏上,这样就好象他扩展了 VB 的功能一样。
老O:哦?就是那个叫什么 VBX 的滥玩意儿?
小B:我呸......别看 VBX 这个东西不起眼儿,的确我也没看上它。但你猜怎么着?现在有成千上万的 VB 程序爱好者把他们写的各式各样功能的 VBX 小程序,放到网上,让大家共享那。
老O:哦~~~,那你们的这个 VBX 标准是什么?
小B:嘿嘿......其实特简单,就是在 VBX 中必须实现7个函数,这7个函数名称和功能必须是:初始化、释放、显示、消息处理......,而至于它内部想干什么,我也管不着。我只是在需要的时候调用我需要的这7个函数。
老O:哦~~~,这样呀......对了,我现有个急事,我先走了。88,你付帐吧......
小B:喂!喂喂...... 走这么急干什么,钱包都掉了:-)
  老O虽然丢了钱包,仍然兴奋地冲回办公室,他开始了思考......

1、我的程序C,要能调用任何人写的程序B。那么B必须要按照我事先的要求,提供我需要的函数F1(),F2(),F3(),K1(),K2()。
2、BASIC 是解释执行,因此它的函数不用考虑书写顺序,只要给出函数名,解释器就能找到。但我使用的是 C++呀......
3、C++编译后的代码中没有函数名,只有函数地址,因此我必须改进为用VTAB(虚函数表)表示函数入口:

图二、VTAB 的结构

4、还不够好,需要改进一下,因为所有的函数地址都放在一个表中会不灵活、不好修改、不易扩展。恩,有了!按照函数功能的类型进行分类:

图三、多个 VTAB 的结构

5、问题又来了,现在有2个 VTAB 虚函数表,那么怎么能够从一个表找到另一个表那?恩又有办法了,我要求你必须要实现一个函数,并且这个函数地址必须放在所有表的开头(表中的第一个函数指针),这个函数就叫 QueryInterface()吧,完成从一个表查找到另一个表的功能:(除了QueryInterface()函数,顺便也完成另外两个函数,叫 AddRef() 和 Release()。这两个函数的功能以后再说)


图四、COM 接口结构

6、为了以后描述方便,不再使用上图(图四)的方法了,而使用图五这样简洁的样式:


转载自:http://www.vckbase.com/document/viewdoc/?id=1485

雪影 2010-08-12
  • 打赏
  • 举报
回复
COM是一种接口规范
DLL只是一种载体而已,
由COM规范写成的DLL,一般叫COM组件
nodiebirdcomeback 2010-08-12
  • 打赏
  • 举报
回复
DLL是种Window系统的文件它可以装载可执行代码和资源,
COM是一种面向对象编程的二进制实现,它需要文件来做
COM组件的载体,而这个可以是DLL形式的文件,也可以是.exe
形式的可执行文件。
magic7004 2010-08-12
  • 打赏
  • 举报
回复
COM和DLL根本就是不同的东西啊....哪个问这个,鄙视它....

米饭和铁锅有什么本质区别呢?
jacks0702 2010-08-12
  • 打赏
  • 举报
回复
com(company),是最常用的国际顶级域名,表示商业网站。
haierfox 2010-08-12
  • 打赏
  • 举报
回复
推荐你一本书,com本质论,看前两章就足够理解了
foreasldjj 2010-08-11
  • 打赏
  • 举报
回复
问题就问得很奇怪,因为两者没有什么可比性。

如果说得是,dll(动态连接库)和lib(静态链接库)的区别,还可以解释。

可以把它们当成一些可以供用户调用的函数

com是一种概念,他出发的目的是解决文件的存储问题,比如在word中存储excel。
他使编程变成了搭积木。由一个个组件来搭软件。

_JeffreyWu 2010-08-09
  • 打赏
  • 举报
回复
COM有3种表现形式,DLL只是一种
visualassist4680 2010-08-09
  • 打赏
  • 举报
回复
第一问这个问题的人,不是自己不明白,就是故意在混淆概念
第二这两个东西的关系就像自来水和婚姻法之间的关系一样
第三楼主考虑一下对方的实力是否值得去

com 是一种标准,一套机制
dll 是一直文件格式, dll 可能实现了com机制,也可能和com 没有任何关系
superdiablo 2010-08-09
  • 打赏
  • 举报
回复
COM的几个本质性的特征
(1) 采用GUID,在一定程度上解决dll hell问题。
(2) 把一组二进制代码用面向对象的方式处理。
(3) 制定了一个统一的二进制代码调用规则。
na_he 2010-08-09
  • 打赏
  • 举报
回复
COM的产生就是为了解决DLL的一些不足,比如二进制码的问题。因此他更加独立,把实现叫给用户,是类重用。而DLL只是简单的对象重用。试想,当DLL的一个功能发生变化之后,所有使用者都可能受到影响。这方面COM则欢迎客户客制化符合于自己的interface。
zjz800800 2010-08-09
  • 打赏
  • 举报
回复
面试官问你的问题不是想让你知道com的巨大理论体系,考察的是你的应用层面,好像是没说,废话,切入正题。

大家知道一般情况下,大家在单位用com或着是dll都是按照具体步骤step by step的去follow。所以考察目的是在应用层面,实质是:在多重继承上dll满足不了同名问题,而com是可以的,其它层面的一般应用dll和com区别不大,只要能回答到这个层面,你的面试就ok了,面试官考察的是c++三大特性的多态。
coolcoffee4051982 2010-08-09
  • 打赏
  • 举报
回复
路过学习
longl215 2010-08-09
  • 打赏
  • 举报
回复
路过学习!!!
Eleven 2010-08-09
  • 打赏
  • 举报
回复
COM是为了二进制兼容而加入了许多限制(COM协议)的DLL
adamwyb 2010-08-08
  • 打赏
  • 举报
回复
路过学习
Summer_King 2010-08-08
  • 打赏
  • 举报
回复
com也可以不以dll的形式出现
tang_12 2010-08-08
  • 打赏
  • 举报
回复
没人要分吗?好像都没有说到最本质的区别
superdiablo 2010-08-08
  • 打赏
  • 举报
回复
COM是一种规范,dll是一种物理文件。
加载更多回复(9)

3,245

社区成员

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

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