类工厂
由于COM组件可以运行在客户进程之外,而且可以被不同语言访问,因此现需要一种语言无关的方法来实例化一个组件。COM提供了接口IclassFactory来完成这个用途,该接口是一个特殊的,必须实现的构造器组件,使用它才能让外部客户创建自己的组件实例。其包括两个方法:
CreateInstance:创建指定组件类的实例并返回该实例返回的接口
HRESULT CreateInstance(
IUnknown * pUnkOuter,
REFIID riid,
void ** ppvObject
);
LockServer:在内存种锁定一台服务器,通常是处于性能考虑
HRESULT LockServer(
BOOL fLock
);
在上面的代码中,CoGetClassObject返回请求的组件(由CLSID标示出来)的类工厂,类工厂创建组件实例并返回所需要的接口,接口调用方法。
在注册表HKEY_CLASSES_ROOT子键CLSID中存放了系统安装的所有组件的描述信息。其主要的注册表主键项如下
- ProgID:为COM类指定ProgID串,它不能包含多于39个字符串,但是可以包含句号
- InprocServer32:包含32位DLL路径和文件名,如果此键值不存在,则系统在PATH路径寻找组件位置
- VersionIndependentProgID:指定组件的最新版本
- LocalServer32:包含32位EXE文件的路径和文件名
- CurVer:组件类最新版本的ProgId
C++中关于COM的宏
COM和ATL使用了很多宏来隐藏不同平台的实现细节,COM接口的声明和定义可以使用四种宏:
- STDMETHOD
- STDMETHODIMP
- STDMETHOD_
- STDMETHODIMP_
在一个接口中定义纯虚方法如:
virtual long Add(long n1,long n2)=0
在COM 中,每一个接口方法都应该返回HRESULT,因此上述方法就变为
virtual HRESULT Add(long n1,long n2,long *pval)=0
COM中对应这样定义
STDMETHOD(Add)(long n1,long n2,long *pval) PURE;
#define PURE =0
STDMETHOD宏的主要作用在于为方法实现预设HRESULT返回类型