描述:
可ATL类是从CComObjectRootEx<CComSingleThreadModel>继承而来得就是已经实现QueryInterface,AddRef,Release()了这些纯虚函数啊
那位知道原因?感谢
解决方案1:
看来还得多说两句
不要把com类局限在c++上,CreateInstance之于COM类相当于new之于C++类,c++做得COM类可以使用new CComObject<yourclass>,但是,并不规范,因为即使是c++做得COM类,new也不能保证生成完备的类实例,比如聚合了其他组件或使用了特殊的动态接口技术,子类(或兄弟类)的实例无法生成,有人可能觉得只要在构造函数中做一些处理就可以解决问题,但是如果你的类是个全局实例且没有使用CRT支持,则类的构造函数将无法被调用,为了解决这个问题,ATL使用了多步构造的方法,将类的初期处理放在成员函数FinalConstruct()中,并使用CComCreator代替new,CreateInstance会使用以上技术,所以保证了任何情况下的正确性。
CInterfaceA是抽象类,因为它还没有实现QueryInterface,AddRef,Release()这些纯虚函数,不信的话可以看看CComObjectRootEx的源代码,只是说在CComObjectRootEx中已经有了实现QueryInterface,AddRef,Release()这些纯虚函数的东西了,真正的实现是在CComObject中实现的。如果真的想用pObj->m_bstrName这样的做法,直接yourclass * pclassinstance = new CComObject<yourclass>就可以了。
解决方案3: 简单问题,却说了这么多废话,一般地,如果你的组件类没有涉及Aggregation的话,可以这么做:
typedef CComObject<CInterfaceA> CIAObject;
CIAObject *pCls=new CIAObject;
或者:
IInterfaceA * pObj = NULL;
CComObject<CInterfaceA>::CreateInstance( &pObj );
CIAObject *pCls=(CIAObject*)pObj;
至于为什么不能实例化CInterfaceA呢?它的确是个抽象基类,所有ATL工程生成的组件类都是抽象基类,它们没有实现IUnknown相关的几个函数,这些函数是由CComObject,CComAggObject(处理与Aggregation相关的组件类)等模板类实现的,它们的模板参数就是自定义的组件类。
我读了N遍ATL 技术内幕,因为你的内是抽象类,它的基类提供了多种辅助实现(注意不是实现),但我们的类没有相应的实现,必须由我们的类的派生类来实现,例如CCOMOBJECT<CINTERFACEA>,就是一个具像类,你可以对它NEW.