相比之下,它们各有什么长处和短处?什么时候适合用COM dll呢?

解决方案 »

  1.   

    COM dll用ATL做的,其他dll用MFC dll或Win32dll做的
      

  2.   

    我也说两句,不知道对不对。
    COM的思想是实现跨平台、跨语言的重用,COM标准是建立在二进制代码级的。所以我用c编的com dll可以应用到vb、java等其它语言当中。但是不采用com开发的dll就不一样了,c开发的dll只能应用到c的程序中。
      

  3.   

    to:HardWorking () 其实,这个问题就是对com的疑惑. 换句话说,既然有了dll,干吗还要com形式的dll?那偶就做个导游,说一些. 
    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(组件对象环境)所拥有
    的个个固定接口,咱们可以访问,当然.