ATL 简单对象的有关问题
ATL 简单对象的问题
class ATL_NO_VTABLE CSimpler :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CSimpler, &CLSID_Simpler>,
public IConnectionPointContainerImpl<CSimpler>,
public CProxy_ISimplerEvents<CSimpler>,
public IDispatchImpl<ISimpler, &IID_ISimpler, &LIBID_SampleCtrlLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IDispatchImpl<IWebBrowser, &__uuidof(IWebBrowser), &LIBID_SHDocVw, /* wMajor = */ 1, /* wMinor = */ 1>,
public IDispatchImpl<IWebBrowser2, &__uuidof(IWebBrowser2), &LIBID_SHDocVw, /* wMajor = */ 1, /* wMinor = */ 1>,
public IDispatchImpl<IWebBrowserApp, &__uuidof(IWebBrowserApp), &LIBID_SHDocVw, /* wMajor = */ 1, /* wMinor = */ 1>
{
public:
CSimpler()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_SIMPLER)
BEGIN_COM_MAP(CSimpler)
COM_INTERFACE_ENTRY(ISimpler)
COM_INTERFACE_ENTRY2(IDispatch, 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()
{
}
编译出现错误
1>c:\vcprj_2005\samplectrl\samplectrl\simpler.h(38) : error C2594: “static_cast”: 从“CSimpler::_ComMapClass *”到“IWebBrowser *”的转换不明确
1>c:\vcprj_2005\samplectrl\samplectrl\simpler.h(40) : error C2594: “static_cast”: 从“CSimpler::_ComMapClass *”到“IWebBrowser *”的转换不明确
1>c:\vcprj_2005\samplectrl\samplectrl\simpler.h(42) : error C2594: “static_cast”: 从“CSimpler::_ComMapClass *”到“IWebBrowserApp *”的转换不明确
------解决方案--------------------
看错了,因为IWebBrowser有继承,修改如下:
class ATL_NO_VTABLE CSimpler :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CSimpler, &CLSID_Simpler>,
public IConnectionPointContainerImpl<CSimpler>,
public CProxy_ISimplerEvents<CSimpler>,
public IDispatchImpl<ISimpler, &IID_ISimpler, &LIBID_SampleCtrlLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IDispatchImpl<IWebBrowser, &__uuidof(IWebBrowser), &LIBID_SHDocVw, /* wMajor = */ 1, /* wMinor = */ 1>,
public IDispatchImpl<IWebBrowser2, &__uuidof(IWebBrowser2), &LIBID_SHDocVw, /* wMajor = */ 1, /* wMinor = */ 1>,
public IDispatchImpl<IWebBrowserApp, &__uuidof(IWebBrowserApp), &LIBID_SHDocVw, /* wMajor = */ 1, /* wMinor = */ 1>
{
public:
CSimpler()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_SIMPLER)
BEGIN_COM_MAP(CSimpler)
COM_INTERFACE_ENTRY(ISimpler)
COM_INTERFACE_ENTRY2(IDispatch, 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()
{
}
编译出现错误
1>c:\vcprj_2005\samplectrl\samplectrl\simpler.h(38) : error C2594: “static_cast”: 从“CSimpler::_ComMapClass *”到“IWebBrowser *”的转换不明确
1>c:\vcprj_2005\samplectrl\samplectrl\simpler.h(40) : error C2594: “static_cast”: 从“CSimpler::_ComMapClass *”到“IWebBrowser *”的转换不明确
1>c:\vcprj_2005\samplectrl\samplectrl\simpler.h(42) : error C2594: “static_cast”: 从“CSimpler::_ComMapClass *”到“IWebBrowserApp *”的转换不明确
------解决方案--------------------
看错了,因为IWebBrowser有继承,修改如下:
- C/C++ code
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() { } }