ATL 简单对象的问题 本帖最后由 winvxd 于 2012-10-18 06:12:13 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 IDispatch->IWebBrowser->IWebBrowserApp->IWebBrowser2接口的继承关系是这样的 这可能是wizard的bug,IDispatchImpl每个类只有继承一次,多了即使编译成功,后面IWebBrowser2的IDispatch接口也被无视class ATL_NO_VTABLE CSimpler :public CComObjectRootEx<CComSingleThreadModel>,public CComCoClass<CSimpler, &CLSID_Simpler>,public IConnectionPointContainerImpl<CSimpler>,public CProxy_ISimplerEvents<CSimpler>,public ISimpler,public IDispatchImpl<IWebBrowser, &__uuidof(IWebBrowser), &LIBID_SHDocVw, /* wMajor = */ 1, /* wMinor = */ 1>,public IWebBrowser2,public IWebBrowserApp{public:CSimpler(){}DECLARE_REGISTRY_RESOURCEID(IDR_SIMPLER)BEGIN_COM_MAP(CSimpler)COM_INTERFACE_ENTRY(ISimpler)COM_INTERFACE_ENTRY(IDispatch)COM_INTERFACE_ENTRY(IWebBrowser)COM_INTERFACE_ENTRY(IConnectionPointContainer)COM_INTERFACE_ENTRY(IWebBrowser)COM_INTERFACE_ENTRY(IWebBrowser2)COM_INTERFACE_ENTRY(IWebBrowserApp)END_COM_MAP()BEGIN_CONNECTION_POINT_MAP(CSimpler)CONNECTION_POINT_ENTRY(__uuidof(_ISimplerEvents))END_CONNECTION_POINT_MAP()DECLARE_PROTECT_FINAL_CONSTRUCT()HRESULT FinalConstruct(){return S_OK;}void FinalRelease(){} } 上面去掉一行COM_INTERFACE_ENTRY(IWebBrowser) 看错了,因为IWebBrowser有继承,修改如下:class ATL_NO_VTABLE CSimpler :public CComObjectRootEx<CComSingleThreadModel>,public CComCoClass<CSimpler, &CLSID_Simpler>,public IConnectionPointContainerImpl<CSimpler>,public CProxy_ISimplerEvents<CSimpler>,public ISimpler,public IDispatchImpl<IWebBrowser2, &__uuidof(IWebBrowser), &LIBID_SHDocVw, /* wMajor = */ 1, /* wMinor = */ 1>{public:CSimpler(){}DECLARE_REGISTRY_RESOURCEID(IDR_SIMPLER)BEGIN_COM_MAP(CSimpler)COM_INTERFACE_ENTRY(ISimpler)COM_INTERFACE_ENTRY(IDispatch)COM_INTERFACE_ENTRY(IConnectionPointContainer)COM_INTERFACE_ENTRY(IWebBrowser)COM_INTERFACE_ENTRY(IWebBrowser2)COM_INTERFACE_ENTRY(IWebBrowserApp)END_COM_MAP()BEGIN_CONNECTION_POINT_MAP(CSimpler)CONNECTION_POINT_ENTRY(__uuidof(_ISimplerEvents))END_CONNECTION_POINT_MAP()DECLARE_PROTECT_FINAL_CONSTRUCT()HRESULT FinalConstruct(){return S_OK;}void FinalRelease(){} } 这个是正解。呵呵。用wizard实现接口后要去掉这个2个多余的,另外,需要手工把BOOL修改成VARIANT_BOOL希望此贴对大家有用。 紧急求助,MFC串口读数无法正常更新界面 c++(CObArry 有关)关于动态对象用不用删除的问题? 栈的使用问题 服务器是双网卡如何配置IP VC++ ADO远程访问ACCESS数据库 关于给按钮添加事件 vc + ado + sql2000 如何取得数据库字段的描述?? 难道只有停在断点处,才能显示当前变量的值吗? 关于资源文件的添加,高手请进!! 能够单独改变一个静态控件(或别的控件)的字体吗? MFC 子对话框和父对话框通信 求VC学习资料
接口的继承关系是这样的
class ATL_NO_VTABLE CSimpler :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CSimpler, &CLSID_Simpler>,
public IConnectionPointContainerImpl<CSimpler>,
public CProxy_ISimplerEvents<CSimpler>,
public ISimpler,
public IDispatchImpl<IWebBrowser, &__uuidof(IWebBrowser), &LIBID_SHDocVw, /* wMajor = */ 1, /* wMinor = */ 1>,
public IWebBrowser2,
public IWebBrowserApp
{
public:
CSimpler()
{
}DECLARE_REGISTRY_RESOURCEID(IDR_SIMPLER)
BEGIN_COM_MAP(CSimpler)
COM_INTERFACE_ENTRY(ISimpler)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IWebBrowser)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY(IWebBrowser)
COM_INTERFACE_ENTRY(IWebBrowser2)
COM_INTERFACE_ENTRY(IWebBrowserApp)
END_COM_MAP()BEGIN_CONNECTION_POINT_MAP(CSimpler)
CONNECTION_POINT_ENTRY(__uuidof(_ISimplerEvents))
END_CONNECTION_POINT_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()HRESULT FinalConstruct()
{
return S_OK;
}void FinalRelease()
{
}
}
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CSimpler, &CLSID_Simpler>,
public IConnectionPointContainerImpl<CSimpler>,
public CProxy_ISimplerEvents<CSimpler>,
public ISimpler,
public IDispatchImpl<IWebBrowser2, &__uuidof(IWebBrowser), &LIBID_SHDocVw, /* wMajor = */ 1, /* wMinor = */ 1>
{
public:
CSimpler()
{
}DECLARE_REGISTRY_RESOURCEID(IDR_SIMPLER)
BEGIN_COM_MAP(CSimpler)
COM_INTERFACE_ENTRY(ISimpler)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY(IWebBrowser)
COM_INTERFACE_ENTRY(IWebBrowser2)
COM_INTERFACE_ENTRY(IWebBrowserApp)
END_COM_MAP()BEGIN_CONNECTION_POINT_MAP(CSimpler)
CONNECTION_POINT_ENTRY(__uuidof(_ISimplerEvents))
END_CONNECTION_POINT_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()HRESULT FinalConstruct()
{
return S_OK;
}void FinalRelease()
{
}
}
用wizard实现接口后要去掉这个2个多余的,另外,需要手工把BOOL修改成VARIANT_BOOL
希望此贴对大家有用。