现在的位置: 首页 > 综合 > 正文

DLL和Com关系

2012年11月26日 ⁄ 综合 ⁄ 共 1064字 ⁄ 字号 评论关闭

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中如此,在很多地方也是这样。 

抱歉!评论已关闭.