C++实现CLR mscorlib::_Assembly接口时报错无法实例化抽象类
错误原因与解决方案
1. 修复继承结构错误
你当前的类存在重复继承、继承权限错误的问题:
- 重复继承了
CComObjectRootEx<CComSingleThreadModel>,会导致编译冲突 IDispatchImpl继承未指定public权限,也未传入必要的IID、类型库LIBID参数- 无需额外继承
IAssembly,IDispatchImpl<IAssembly>已经包含了该接口的继承
修正后的类定义开头:
typedef mscorlib::_Assembly IAssembly; class CIAssembly : public CComObjectRootEx<CComSingleThreadModel>, public IDispatchImpl<IAssembly, &__uuidof(IAssembly), &LIBID_mscorlib> {
2. 修复COM映射配置
你注释掉了IDispatch接口的映射入口,导致COM框架无法找到IDispatch的实现,取消注释即可:
BEGIN_COM_MAP(CIAssembly) COM_INTERFACE_ENTRY(IAssembly) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_objUnk) END_COM_MAP()
3. 修正方法签名的命名空间匹配问题
报错提示三个方法为抽象,核心原因是你实现的方法参数类型没有补全mscorlib命名空间,编译器判定和基类的纯虚函数签名不匹配,没有实现基类要求的接口:
所有方法中用到的mscorlib库内类型(_Type、_AssemblyName、_MethodInfo等)都要加mscorlib::前缀,示例如下:
// 错误写法 HRESULT STDMETHODCALLTYPE GetType(__out struct _Type * * pRetVal); // 正确写法 HRESULT STDMETHODCALLTYPE GetType(__out mscorlib::_Type * * pRetVal); // 另外两个报错方法同理修正 HRESULT STDMETHODCALLTYPE GetName(__out mscorlib::_AssemblyName * * pRetVal); HRESULT STDMETHODCALLTYPE GetName_2(__in VARIANT_BOOL copiedName, __out mscorlib::_AssemblyName * * pRetVal);
4. 删除多余的IDispatch方法声明
你手动声明的四个IDispatch接口方法(GetTypeInfoCount、GetTypeInfo、GetIDsOfNames、Invoke)已经由IDispatchImpl默认实现,手动声明会导致实现冲突,直接删除这四个方法的声明即可。
完成以上修改后重新编译即可解决抽象类无法实例化的问题。
内容的提问来源于stack exchange,提问作者nopx90
相关产品推荐
相关产品推荐

