将 2010 Visual Studio 迁移到 2015 Visual Studio 时遇到问题。 任何帮助将不胜感激。 注意:此模块中的任何地方均未使用 IAxWinAmbientDispatch 或 CAxHostWindow。 当我在此遗留应用程序的任何项目中包含“atlctl.h”时,出现同样的错误。
class ATL_NO_VTABLE CWebHostCls :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CWebHostCls , &CLSID_WEBDialog>,
public IDispatchImpl<ICWebHostCls , &IID_ICWebHostCls, &LIBID_WEBHOST>,
public IObjectSafetyImpl<CWebHostCls , INTERFACESAFE_FOR_UNTRUSTED_CALLER>,
#ifndef _ATL_NO_DOCHOSTUIHANDLER
public IDocHostUIHandler
#endif
> "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcom.h(3578):
> error C2259: 'ATL::CComContainedObject<contained>': cannot instantiate abstract class
> with
> [
> contained=ATL::CAxHostWindow
> ]"
> "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcom.h(3578): note: due to following members:
> C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcom.h(3578): note: 'HRESULT IAxWinAmbientDispatch::put_AllowWindowlessActivation(VARIANT_BOOL)': is abstract
> C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atliface.h(1501): note: see declaration of 'IAxWinAmbientDispatch::put_AllowWindowlessActivation'
> C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcom.h(3578): note: 'HRESULT IAxWinAmbientDispatch::get_AllowWindowlessActivation(VARIANT_BOOL *)': is abstract"
>
> ```
包含此代码片段的通用头文件是此问题的根本原因。 类 SafeVariantBool { 民众: 隐式 SafeVariantBool(短 bVariant = VARIANT_FALSE) { 运算符=(bVariant); } 隐式 SafeVariantBool(bool bVariant) { 运算符=(bVariant); }
// required because of ATL defines for ATL_VARIANT_TRUE / ATL_VARIANT_FALSE
// and to allow default values in IDL
implicit SafeVariantBool(int bVariant)
{ operator=(static_cast<short>(bVariant)); }
SafeVariantBool operator=(short bVariant)
{
ASSERT(bVariant == VARIANT_TRUE || bVariant == VARIANT_FALSE);
_bVariant = bVariant;
return *this;
}
SafeVariantBool operator=(bool bVariant)
{ return operator=(bVariant ? VARIANT_TRUE : VARIANT_FALSE); }
operator short() const
{ return _bVariant; }
bool get() const
{ return _bVariant != VARIANT_FALSE; }
short* GetAddress()
{ return &_bVariant; }
private:
short _bVariant;
};
#define VARIANT_BOOL SafeVariantBool
#define false (!true)