编写可复用性更好的C++代码:Band对象和COMToys(9)
2006-07-21 11:45:59 来源:WEB开发网除了实现像CTMfcContextMenu之类的类以外,COMToys只有三个地方确实需要MFC支持。IMPLEMENT_IUnknownCT假设某个CCmdTarget派生主类实现IUnknown。CTFactory没有像它应该做的那样实现IClassFactory,所以你需要一个COleObjectFactory派生类工厂来创建对象。CTModule不实现模块锁定或者DllGetClassObject,所以你需要CTMfcModule来获得这些重要的细节。为了完全将COMToys完全和MFC隔离,你只要填补这些缝隙就可以了。
至于IUnknown,必须由一个基本的CTUnknown来实现AddRef,Release,和 QueryInterface。AddRef/Release可以很简单地对数据成员m_dwRef进行++/--操作,而QueryInterface调用理论上等价的GetInterfaceHook,GetInterfaceHook必须由外部类提供。你可以派生另一个实现(把它叫做CTUnknownMTA),这个实现用InterlockedIncrement 和 InterlockedDecrement代替++/--。有了这些实现,你的COM类就可以用IMPLEMENT_ IUnknown(CMyComClass, CTUnknown)来代替当前设计用于CCmdTarget 的IMPLEMENT_IUnknownCT宏。这样做就有点像ATL了——但不涉及模板。
至于类工厂,必须为CTFactory实现IClassFactory。这个实现可以调用某个名字类似OnCreateObject的虚函数,每一个COM类都不必须通过返回“new CMyComClass”来提供这个虚函数。(COleObjectFactory用MFC运行时系统创建对象。)
为了钩挂类工厂,必须实现CTModule::OnDllGetClassObject。它将搜索类工厂列表来查找谁的CLSID与请求的匹配,然后调用它的CreateInstance方法。
最后还有两件事情要做:一是要在CTModule中编写一些代码来进行模块锁定(CTModule::OnDllCanUnloadNow);二是当获得DLL_PROCESS_ATTACH/DETACH.时,在DllMain中初始化或终止这个模块。
更多精彩
赞助商链接