怎样区分DLL和COM,我现在有一个后缀为.DLL的文件。但是我不知道这是个DLL还是COM
请问怎么区分出来
谢谢

解决方案 »

  1.   

    比如有个a.dll执行下列命令:
    regsvr32 a.dll若出现“a.dll中的DllRegisterServer成功”的对话框,则说明肯定是个COM如果失败,则有一定可能性为COM,继续判断的方式很多(比如用dumpbin查看导出函数表,如果存在这么几个函数:DllCanUnloadNow,DllGetClassObject,那基本上可以肯定就是个COM)如果这个dll文件是某个需要安装的应用程序的组成部分,那么还可以到注册表中查找这个dll是否被注册,查找关键字是该dll所在位置的全路径
      

  2.   

    你用DEPENDS看他们的导出函数,
    导出了DllRegisterServer(),DllUnregisterServer()函数的是COM
    没有导出的是DLL
      

  3.   

    看导出函数啊,COM 的导出函数一般只有 4 个,而且函数名都是固定的,如下:
    DllCanUnloadNow
    DllGetClassObject
    DllRegisterServer
    DllUnregisterServer
      

  4.   

    COM和DLL不是同一个概念级的。COM是一种架构,DLL是一种文件结构。COM借助与DLL形式表示。一个COM的DLL肯定要导出上面的那几个函数,但是一个普通的DLL也可以导出上面的那几个函数,并且可以改写其内容,这只是一个导出函数名而已,执行可以不同,呵呵。
      

  5.   

    看导出函数使用VS自带的Dumpbin程序。参考MSDN。
      

  6.   

    谢谢各位的解答
    但是现在我看了一下注册表下面有这个注册相
    但是在DEPENDS中却看不到以下这四个函数
    DllCanUnloadNow
    DllGetClassObject
    DllRegisterServer
    DllUnregisterServer晕了
    盼各位积蓄解答
      

  7.   


    dumpbin -exports 你的dll.dll的结果贴出来,帮你看
      

  8.   

    Microsoft (R) COFF Binary File Dumper Version 6.00.8447
    Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
    Dump of file C:\Mytest.dllFile Type: DLL  Section contains the following exports for Mytest.dll           0 characteristics
        42FB0912 time date stamp Thu Aug 11 16:15:14 2005
            0.00 version
               1 ordinal base
               9 number of functions
               0 number of names    ordinal hint RVA      name          1      000059B0 [NONAME]
              2      000057F0 [NONAME]
              3      000056C0 [NONAME]
              4      00005730 [NONAME]
              5      0000B6D0 [NONAME]
              6      00005610 [NONAME]
              7      00005650 [NONAME]
              8      00005690 [NONAME]
              9      000056A0 [NONAME]  Summary        6000 .data
            6000 .rdata
            2000 .reloc
            1000 .rsrc
           1B000 .text
      

  9.   

    depends看:
    1 (0x0001)
    2 (0x0002)
    3 (0x0003)
    4 (0x0004)
    5 (0x0005)
    6 (0x0006)
    7 (0x0007)
    8 (0x0008)
    9 (0x0009)
      

  10.   

    看导出函数
    DllCanUnloadNow
    DllGetClassObject
    DllRegisterServer
    DllUnregisterServer
      

  11.   

    是啊
    那个名字就是NONAME
    这个DLL是以前我写的
    但是后来辞职了
    今天偶尔看了以下新的版本
    竟给弄成了这个样子不知道怎么搞得
      

  12.   

    COM和DLL不是同一个概念级的。COM是一种架构,DLL是一种文件结构。COM借助与DLL形式表示。一个COM的DLL肯定要导出上面的那几个函数,但是一个普通的DLL也可以导出上面的那几个函数
    已经说的这么清楚了
    com是一种概念,dll是一种文件格式,两个没有可比性
      

  13.   

    你的DLL是不是涉及到安全方面?
      

  14.   

    COM 是在其上生成 ActiveX 控件和 OLE 的基本“对象模型”。COM 允许对象向其他组件和宿主应用程序公开其功能。它既定义对象如何公开自身,又定义此公开如何跨越多个进程和网络进行工作。COM 还定义对象的生命周期。
    以下这些概念是 COM 的基础: 接口 — 对象用来公开其功能的机制。 
    IUnknown — 作为所有其他接口之基础的基本接口。它通过 COM 实现对引用计数和接口查询机制的运行。 
    引用计数 — 对象(严格地说是接口)用来决定它何时不再被使用并因此可以自由地移除自身的技术。 
    QueryInterface — 用于查询对象的给定接口的方法。 
    封送处理 — 使对象能够跨越线程、进程和网络边界使用并允许其具有位置独立性的机制。 
    聚合 — 一种使一个对象可以利用其他对象的方法。
      

  15.   

    编写一个测试程序,测试其是否含有类型库信息
    假设其Dll文件名称为 xx.dll
    在程序中书写如下代码
    #import "xx.dll" 
    编译此程序,查看其输出目录中是否含有 xx.tlh 的文件。如果发现此文件,就说明此Dll含有类型库信息,从而确定其是 Com
      

  16.   

    你那个铁是dll,因为你导不出这几个函数。如果能导出这几个函数则说明它最基本也算是一个com。