整容说文库 > 程序代码 > 教育资讯

多接口组件产生warpper包装类时的问题

来源:学生作业帮助网 编辑:整容说文库 时间:2021/01/19 07:59:35 程序代码
多接口组件产生warpper包装类时的问题程序代码
我有一个组件类如下:这个WarpObj实现了两个接口IWarpObj,IWarpImpl; 用 VC6.0 "Add Class From TypeLib"的方式对两个接口产生了两个包装类CWarpObj,CWarpImpl;其中CWarpObj可以用CreateDispatch("comwarp.warpObj")实例化,那么CWarpImpl申明的这个对象可以用什么办法实例化呢?在非Warpper的使用方式中是可以用Queryinterface来查询并得到接口的,请问在这种warpper类里这种情况CWarpImpl类该怎么实例化?
(1)实例化代码: CWarpObj warpObj;
CWarpImpl warpImpl;

bl=warpObj.CreateDispatch("comwarp.warpObj");

(2)原组件代码:
class ATL_NO_VTABLE CWarpObj : 
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CWarpObj, &CLSID_WarpObj>,
public IDispatchImpl<IWarpObj, &IID_IWarpObj, &LIBID_COMWARPLib>,
public IDispatchImpl<IWarpImpl, &IID_IWarpImpl, &LIBID_COMWARPLib>
{
public:
CWarpObj()
{
}

DECLARE_REGISTRY_RESOURCEID(IDR_WARPOBJ)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CWarpObj)
COM_INTERFACE_ENTRY(IWarpObj)
COM_INTERFACE_ENTRY(IWarpImpl)
COM_INTERFACE_ENTRY2(IDispatch,IWarpObj)
END_COM_MAP()
/
...
../

};
难道你Queryinterface不到吗????
warpObj->QueryInterface(IID_IWarpImpl,.........);
一定可以查询到的.
warpobj没有QueryInterface这个方法;IID_IWarpImpl的也没定义!
不会的, 每个COM对象均要实现IUnknown的3个方法的.ATL已经为你做了.
这里是wapper后的包装类了,没有这个方法;而且也不想又包含***_i.c 来得到IID_****,理想的状态是"Add Class From TypeLib"的时候这些东西都加入了进来!
那CWarpObj的基类是COleDispatchDrive吗? 这样可以CreateDispath(...);

CWarpImpl的基类是什么?
把IID的定义拷贝过来不就可以了吗, CWarpObj是一定可以调用QueryInterface的,因为的他的基类是COleDispatchDrive, COleDispatchDrive就是IDispatch接口的包装,IDispatch一定是从IUnknown派生的,所以一定可以QueryInterface的.

如果你觉得还不好,可以在IWarpObj中提供一个方法来创建一个IWarpImpl.
程序代码