{
// this function is used to retrieve other interfaces
virtual HRESULT __stdcall QueryInterface(const IID &iid, (void **)ip) = 0;
// this is used to increment interfaces reference count
virtual ULONG __stdcall AddRef() = 0;
// this is used to decrement interfaces reference count
virtual ULONG __stdcall Release() = 0;
};
COM的一条规则是如果你有一个接口你应当能够通过该接口访问到其他任何接口,只要这些接口是来自同一个COM对象。
基本上,这个意味着你能从任何地方到任何地方(即实现同一COM对象各接口间切换)。
图5.5 COM对象各接口间切换(一个COM对象可以有多个接口)
技巧:通常你无须亲自对接口或COM对象调用AddRef() 。其被内置在函数QueryInterface()中。但是有时当你要增加对COM对象的记数
以让COM对象误以为有更多的对该对象的引用时,那你也不得不亲自调用这个函数了。
Release()函数调用用于减少COM对象或接口的引用计数。大多情况下,当完成一个接口以后,你必须自己调用该函数。但是有些时候,
你创建了一个对象,但是又以它为基础(类)创建了另一个对象,执行父类Release() 方法会造成对子类Release()的执行。所以较好的做法是按获得指针
相反的次序执行Release()比较好。