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