相比之下,它们各有什么长处和短处?什么时候适合用COM dll呢?
解决方案 »
- 类似迅雷多线程下载是怎么实现的?
- 紧急求助,WINCE画图内存泄露,非常严重。
- 文件传送与SOCKET问题!(得到答案就马上给分!)
- 橡皮条如何不擦除背景?
- 初学windows编程,请教。
- 请common_man近来领分,非常感谢他帮我解决了图形编程中的难题
- 有没有天津科技大学或者是杭州电子工业学院的学生,哪个教学质量好?
- SetViewportOrgEx和SetWindowOrgEx有什么区别???
- socket通信中如何发送对象??
- 为什么我装的vc6.0中的结构体DSBUFFERDESC不包含guid3DAlgorithm项?
- BSTR类型数据的内存泄漏问题?
- 音频编程及录音高手看一看,如何控制音频接口?????一个复杂的问题
COM的思想是实现跨平台、跨语言的重用,COM标准是建立在二进制代码级的。所以我用c编的com dll可以应用到vb、java等其它语言当中。但是不采用com开发的dll就不一样了,c开发的dll只能应用到c的程序中。
dll在传统的程序员眼里,就是一个建个win32 dll工程,写个dllmain(),写个
导出函数,一编译,就ok拉. 一个dll,是不是很简单? 确实,exe调用dll也是
很简单,它(dll)更象一个函数体,来供exe调用.当然,它们处在同一个进程内.好,下面就提问题了:我能不能写个第二版本的dll,来直接替换? 如果我导出的
是一个类的构造函数,和它的一个成员函数,并且再二版中,我又给它(类)加了
一个私有变量,这样直接替换行不行?先说问题1: 最终结果很难说. 你替换之后,可能会正常工作,可能会出现莫名其妙
的返回值,可能会死掉进程,可能会死机,可能会格式化硬盘...不可测. 你会问
为什么? 看第二个问题.问题2: 在版本1,我导出一个构造函数,和它的一个成员函数,在exe中,按常规
方式我把编译dll时的.h 和 .lib嵌入进来,编译好,运行正常. 好进行2版的
替换,我直接把dll复制过来,替换原先的dll. 假设,在exe中你是这样写的代码:
int main() {
CMydll mydll;
for(int i=0;i<10000;++i)
itest = mydll.MenberFunc();
... ...
}那么,for会进入死循环.(我测试过) 你会问 why?? i的 内存被重复i和
新添的哪个私有变量轮换霸占,它俩都在不断的写入自己的值. 死循环.你有会问,为什么? 记得你嵌入的.h 和.lib吗? exe在编译时期会根据这些
信息"决定CMydll对象的大小"! 记得咱们在 2版时加入的私有变量吧?
那么"CMydll对象的大小"变大了吧? 可是exe不知道啊,它很笨,还是按原先
的方式分内存的.... 悲剧如上上映. 你会问我,花了这么多口水,一个com没提,不是废话吗? com要解决的一个重
大问题,就是二进制的可替换性!! 那你又会问,上面这种问题如何解决?
呵呵,com来了,姗姗来迟的这种. 接口!! 什么是接口? (用c++说) 抽象基类.
里面全部是纯虚拟函数,没有任何成员变量. 有问,为什么要这样? c++编译器
厂商大战的结局. 那群乌鸦对类的内存分布,各持己见 (主指vtbl). 而有的
乌鸦,把成员变量放在内存虚拟表的首位,有的在末位...所以com不许有成员变量.如此以来,不仅解决了替换问题,还为跨语言,跨平台提供了基础. 继续.
为了在 真正意义上实现重用性,需要有种标准,不能a公司的代码,那到b公司
就不能用了,就出现了统一接口: IUnknown. 为了exe不管dll具体在什么位置
而能够调用,就采用了windows的注册表,和GUID. 为了实现跨编程语言,而
定义IDispatch. 为了实现远程调用,而用RPC和代理/存根.呼... 看看,Com的dll 和常见的dll,还有什么不同?
哦,com+ 和com的不同是: 通常的com对系统明显的依赖是注册表.
com+可多的多了. 它在com的基础上,进一步发展,为的是解决 同步,事务...
这些都要依靠win2k的鼎立支持: mts msmq... 诺,你看到了,尽是服务
(系统给的). 当然,com+为了能够利用这些服务,只有一个IUnknown和
IDispatch是不够的,它又开发了许多系统接口,象OC(组件对象环境)所拥有
的个个固定接口,咱们可以访问,当然.