请问有谁知道DLL和接口的区别?

解决方案 »

  1.   

    接口一般是dll,dll不一定时接口
      

  2.   

    接口的概念用滥了,到处都是接口,你提的问题,DLL和接口的区别,问题本身就不对,风马牛不相及的事情。接口:是操纵一种模块的约定。
    DLL:是动态链接库,通常指win32中一种可以复用的可执行映像文件。我猜想你的问题是:DLL和com的关系com对象通常都存在于一个DLL中,有时候Com服务器存在于一个Exe中。存在于DLL中的Com,或者说包含Com对象的DLL都遵守一个约定,他们都必须实现以下引出函数
      DllGetClassObject,
      DllCanUnloadNow,
      DllRegisterServer,
      DllUnregisterServer;
    在Delphi中这些函数已经实现,不用做这些重复的工作。
    其中DllGetClassObject最重要,它是外界获得具体对象接口(这个接口,是特定的,指一个指向二进制结构的指针)的唯一办法。
    这个函数的Pascal原形
    function DllGetClassObject(const CLSID, IID: TGUID; var Obj): HResult;其中,CLSID是类ID,我认为它表明了一个创建具体对象的类工厂,IID是类工厂接口的ID,通常只有两种。
      IClassFactory = interface(IUnknown)
        ['{00000001-0000-0000-C000-000000000046}']
    或者
      IClassFactory2 = interface(IClassFactory)
        ['{B196B28F-BAB4-101A-B69C-00AA00341D07}']
    在获得了类工厂接口之后,就可以调用
        function CreateInstance(const unkOuter: IUnknown; const iid: TIID;
          out obj): HResult; stdcall;
    或者
        function CreateInstanceLic(const unkOuter: IUnknown; const unkReserved: IUnknown;
          const iid: TIID; const bstrKey: WideString; out vObject): HResult; stdcall;
    来取得DLL中包含的Com对象的接口了。任何具体的Com对象都是由程序自己创建的,但是基于一个规则,就是创建类工厂,然后用类工厂创建具体对象。
    通常,在一个DLL中只有一个com对象,但是,这个对象可以支持多个接口。在Delphi中也是这样。DLL也可以有多个Com对象,但是一个Com对象对应一个类工厂,在Delphi中如此,在很多地方也是这样。