0

由于更新了库,我必须将大型 c++ 程序从 VS2010 迁移到 VS2015。在VS2010中全部编译OK。VS2015的编译器现在在微软自己的atlcom.h中显示错误

我没有机会放弃 ATL 的东西,因为我的 DLL 是依赖于 ATL 的主要程序的扩展(并且在 VS2015 中编译......)。

这是 cl 2015 的错误消息:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcom.h(3448): error C2259: 'ATL::CComContainedObject<contained>': cannot instantiate abstract class
        with[ T=CMyReferenceDat ]
...\atlcom.h(3448): note: due to following members:
...\atlcom.h(3448): note: 'HRESULT IZEDOInteractionCallback::OnPostUISizeboxEdit(IZElement *,VARIANT_BOOL *)': is abstract
...\icapiironcad.tlh(11979): note: see declaration of 'IZEDOInteractionCallback::OnPostUISizeboxEdit':

      virtual HRESULT __stdcall OnPostUISizeboxEdit (
        /*[in]*/ struct IZElement * piElement,
        /*[in,out]*/ VARIANT_BOOL * pvbOverride ) = 0;

...\atlcom.h(2000): note: see reference to class template instantiation 'ATL::CComAggObject<T>' being compiled
        with[ T=CMyReferenceDat ]

...\atlcom.h(1989): note: while compiling class template member function 'HRESULT ATL::CComCreator<ATL::CComAggObject<T>>::CreateInstance(void *,const IID &,LPVOID *)'
        with[ T=CMyReferenceDat ]   

...\atlcom.h(2094): note: see reference to function template instantiation 'HRESULT ATL::CComCreator<ATL::CComAggObject<T>>::CreateInstance(void *,const IID &,LPVOID *)' being compiled
        with[ T=CMyReferenceDat ]

...\atlcom.h(2096): note: see reference to class template instantiation 'ATL::CComCreator<ATL::CComAggObject<T>>' being compiled
        with[ T=CMyReferenceDat ]

...\atlcom.h(2091): note: while compiling class template member function 'HRESULT ATL::CComCreator2<ATL::CComCreator<ATL::CComObject<T>>,ATL::CComCreator<ATL::CComAggObject<T>>>::CreateInstance(void *,const IID &,LPVOID *)'
        with[ T=CMyReferenceDat ]   

...\QuickConnector.cpp(30): note: see reference to function template instantiation 'HRESULT ATL::CComCreator2<ATL::CComCreator<ATL::CComObject<T>>,ATL::CComCreator<ATL::CComAggObject<T>>>::CreateInstance(void *,const IID &,LPVOID *)' being compiled
        with[ T=CMyReferenceDat ]

...\QuickConnector.cpp(29): note: see reference to class template instantiation 'ATL::CComCreator2<ATL::CComCreator<ATL::CComObject<T>>,ATL::CComCreator<ATL::CComAggObject<T>>>' being compiled
        with[ T=CMyReferenceDat ]

jom: ...\QuickConnector\Makefile [QuickConnector.obj] Error 2
jom: ...\src_abgeruestet2\debug\Makefile [sub-QuickConnector-make_first] Error 2
16:25:39: Der Prozess "C:\Users\Andreas4\msvc_make.bat" wurde mit dem Rückgabewert 2 beendet.
Fehler beim Erstellen/Deployment des Projekts qc (Kit: Qt 5.6.3 64bit mit VS 2015)

错误指向atlcom.h(VS2015的编译器)的第3448行:

CComContainedObject<contained> m_contained;

CComContainedObject 的定义是 atlcom.h 的第 3277 行:

template <class Base> //Base must be derived from CComObjectRoot
class CComContainedObject : public Base
{
public:
    typedef Base _BaseClass;
    CComContainedObject(_In_opt_ void* pv) 
    {
        m_pOuterUnknown = (IUnknown*)pv;
    }
    // some additional members
}

我的课是:

class ATL_NO_VTABLE CMyReferenceData :

        public CQcEdoBase,
        public IQcEdoReferenceData,
        public IPersistStream,
        public IZEDORenderCallback,
        public IZEDOInteractionCallback,
        public IZEDOSelectionCallback,
        public CComCoClass<CMyReferenceData, &CLSID_CMyReferenceData>
{
    UniqueIDType id;
    QMutex PopupMenuMutex;
    static bool DrawHUDElements;
    static QHash<UniqueIDType, UniqueIDType> loadedElementIdDict;

public:
    CMyReferenceData();

    DECLARE_REGISTRY_RESOURCEID(IDR_QCEDOREFERENCEDATA)
    DECLARE_PROTECT_FINAL_CONSTRUCT()

    BEGIN_COM_MAP(CMyReferenceData)
    COM_INTERFACE_ENTRY(IQcEdoReferenceData)
    COM_INTERFACE_ENTRY_CHAIN(CQcEdoBase)
    COM_INTERFACE_ENTRY(IPersistStream)
    COM_INTERFACE_ENTRY(IZEDOInteractionCallback)
    COM_INTERFACE_ENTRY(IZEDORenderCallback)
    COM_INTERFACE_ENTRY(IZEDOSelectionCallback)
    END_COM_MAP();

    // IEDOText
    STDMETHOD(get_ID)(/*[out, retval]*/ unsigned long long *pVal);
    STDMETHOD(put_ID)(/*[in]*/ unsigned long long newVal);

    // IZEDOInteractionCallback
    STDMETHOD(OnMenuCommand)(IZElement * piElement, long Id);
    STDMETHOD(OnPopupMenu)(IZElement * piElement, LONG_PTR HWND, LONG clientX, LONG clientY, eZSubSelectionType SelectionType, IZMenu* piMenu, VARIANT_BOOL * bOverride);

    // IPersistStream
    STDMETHOD(GetClassID) ( LPCLSID lpClassID) ;
    STDMETHOD(IsDirty)( void);
    STDMETHOD(Load)(IStream *pStm);
    STDMETHOD(Save)(IStream *pStm, BOOL fClearDirty);
    STDMETHOD(GetSizeMax)(ULARGE_INTEGER *pcbSize);

    // IZEDORenderCallback
    STDMETHOD(OnDraw)(IZElement * piElement, IZRender * piRender, VARIANT_BOOL * bOverride);
    STDMETHOD(OnHotDraw)(IZElement * piElement, IZRender * piRender, VARIANT_BOOL * bOverride);
    STDMETHOD(OnDrawAccessories)(IZElement * piElement, IZRender * piRender, VARIANT_BOOL * bOverride);

    // IZEDOSelectionCallback
    STDMETHOD(OnDeselect)(IZElement* piElement, VARIANT_BOOL* pOverride);
    STDMETHOD(OnSelect)(IZElement* piElement, VARIANT_BOOL* pOverride);

    // Standard c++
    static bool DisplayHUD();
    static bool ToggleDisplayHUD();
    static void SetDisplayHUDEnabled(bool yes);

    static void ClearElementIdDict();
};

有任何想法吗?你真的很受欢迎。

4

0 回答 0