WEB开发网
开发学院软件开发VC IUnknown—COM和MFC 阅读

IUnknown—COM和MFC

 2006-07-21 11:43:14 来源:WEB开发网   
核心提示: 7、所有的函数返回、返回、返回……..而调用者只管接收某个接口指针,谁说COM难学?在结束本文的讨论前,IUnknown—COM和MFC(5),我想指出两个有用的技巧和建议,重载MFC缺省行为的方式有很多,在我的另一篇文章中,曾讨论过如何重载GetInterfa

7、所有的函数返回、返回、返回……..而调用者只管接收某个接口指针。

谁说COM难学?

在结束本文的讨论前,我想指出两个有用的技巧和建议。重载MFC缺省行为的方式有很多。第一,你可以在类工厂中,有时你可能想从COleObjectFactory类派生自己专用的类工厂。只要你愿意,可以这么做,诀窍是将类工厂挂钩在对象上。不要使用DECLARE_OLECREATE 和 IMPLEMENT_OLECREATE,因为这些宏已经将ColeObjectFactory写死在里面了。但你可以拷贝这些宏、改名以及江类工厂的名字改为自己的名字。尤其是你可能要重载COleObjectFactory::OnCreateObject方法。例如,如果你的COM对象是单实例的,就要重载OnCreateObject返回一个且是唯一的一个对象实例(不要使用静态对象,要不然可能遇到引用计数问题,因为静态实例引用计数是1并且最终得不到Release释放。应该取而代之用new在堆中分配单实例)。

最后,一个非常有用的重载是GetInterfaceHook。记得GetInterface吗?这个函数在你的接口映射中查找接口,或如果请求的是IUnknown,则就返回第一个接口。下面是一段参考代码:

LPUNKNOWN CCmdTarget::GetInterface(const void* iid)
{
// 允许常规构子首先起来
LPUNKNOWN lpUnk;
if ((lpUnk = GetInterfaceHook(iid)) != NULL)
return lpUnk;
……
// 如前所述
}

在做其它事情之前,GetInterface调用虚函数CCmdTarget::GetInterfaceHook,缺省CCmdTarget实现返回NULL,但如果你想以某种特别方式实现QueryInterface接口的话,只要重载GetInterfaceHook并返回别的东西就行了。一旦GetInterfaceHook的返回值为非空接口指针,则它首先调用QueryInterface,MFC将用到它。在我的另一篇文章中,曾讨论过如何重载GetInterfaceHook来完成一个完全不同的COM实现,其中用了ATL风格的多继承代替了MFC的嵌套类。

谁说COM复杂难懂?

上一页  1 2 3 4 5 

Tags:IUnknown COM MFC

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接