编写可复用性更好的C++代码:Band对象和COMToys(8)
2006-07-21 11:45:57 来源:WEB开发网图十八 MFC和非MFC类之间的关系
关于类工厂的实现,COMToys 依赖于MFC模仿类:CTFactory。CTModule::OnRegisterServer调用一个静态函数,CTFactory::OnRegisterAll,它具备针对每一个类工厂调用的CTFactory::OnRegister。当创建CTFactory的时候。必须指定的一个参数之一是资源ID。缺省情况下,CTFactory::OnRegister查找有相同ID的脚本文件资源并调用ATL注册器运行它。但首先它要调用另一个虚函数:OnInitRegistryVariables,以便初始化通用的注册器变量,如%CLSID% 和%ClassName%.,下面是ComToys在 CTComObjFactory::OnInitRegistryVariables 定义的变量清单:
%CLSID% = class ID (GUID) (COleObjectFactory::m_clsid)
%MODULE% = full pathname of DLL
%Title% = title (resource substring 0)
%ClassName% = human-readable COM class name (resource substring 1)
%ProgID% = ProgID (resource substring 2)
%ThreadingModel% = "", "Apartment", "Free", or "Both" (m_nThreadingModel)
可以重载 OnInitRegistryVariables 添加自己的注册器变量。这些都与前几部分的做法一样,只是现在的代码被从Band对象中抽象出来进入了COMToys。最终,在进行注册与注销的处理时,所要做的全部工作是编写一个注册脚本并将它作为资源放入资源文件,让它的ID与COM类相同。
IDR_MYCOMCLASS REGISTRY DISCARDABLE "MyComClass.rgs"
应该指出,CTFactory有一个地方很伤脑筋:它本应该实现IClassFactory,但是它没有。那是因为我还没来得及顾上它。因为到目前为止我所建立的所有COM类都与MFC有关,我一直都用COleObjectFactory,它很好用。因此,我从COleObjectFactory 和 CTFactory 派生 CBandObjFactory。如果需要非MFC类工厂,可以为 CTFactory 实现一个IClassFactory。不过现在有CTFactory,COleObjectFactory相伴左右,CTFactory提供了所有注册工作所需要的东西,很容易使用。而COleObjectFactory提供了IClassFactory接口和与DllGetClassObject的联接。 当Windows资源管理器(Explorer)之类的进程想要创建自己的COM对象实例时——假设是创建MyBands.dll中的Band对象——它调用CoCreateInstance函数,这个函数读取注册表确定加载哪一个DLL并加载它,然后调用DllGetClassObject(在DllEntry.cpp中)函数,它再接着调用CTModule::OnGetClassObject。因为BandObj是一个基于MFC的对象,它使用CTMfcModule,其OnGetClassObject函数调用MFC的AfxDllGetClassObject函数。MFC搜索类工厂清单及其它处理。到这里也许有人会问:类工厂是在哪儿创建的呢?通常在MFC中创建类工厂用的是DECLARE_OLECREATE 和 IMPLEMENT_OLECREATE。这些宏声明并实例化一个静态COleObjectFactory对象:它的形式为CMyComClass::类工厂。但前面四个部分中的BandObj和COMToys都没有使用DECLARE/IMPLEMENT_OLECREATE,因此,为了创建自己的类工厂,这就要调用new进行动态创建:
更多精彩
赞助商链接