I create a ATL project with Visual Studio 2010, and add a ATL simple object class in this project. There is no any error during the building process. But when I declare a class object, such as
CCartoPoint pt, I get the error message "
error C2259: 'CCartoPoint' : cannot instantiate abstract class"
In the following codes, the error message is from the method '
STDMETHODIMP CCartoPoint::get_Centroid( ICartoPoint** pCentroidVal)'.
I have checked the the numbers of methods in
IDL file, in
.h file and the
.cpp file is same.
The *.IDL file:
[
object,
uuid(14428BC6-A897-4268-8FFD-B4947DEDDFC6),
dual,
nonextensible,
pointer_default(unique)
]
interface ICartoPoint : IDispatch{
[propget, id(2)] HRESULT X([out, retval] DOUBLE* pVal);
[propput, id(2)] HRESULT X([in] DOUBLE newVal);
[propget, id(3)] HRESULT Y([out, retval] DOUBLE* pVal);
[propput, id(3)] HRESULT Y([in] DOUBLE newVal);
};
[
object,
uuid(238155D0-220A-4BFA-90D2-46E27461E314),
dual,
nonextensible,
pointer_default(unique)
]
interface ICartoGeometry : IDispatch{
[propget, id(1)] HRESULT Area([out, retval] DOUBLE* pAreaVal);
[propget, id(2)] HRESULT Centroid([out, retval] ICartoPoint** pCentroidVal);
[propget, id(3)] HRESULT GeometryType([out, retval] cartoGeometryType* pTypeVal);
[propget, id(5)] HRESULT NumGeometries([out, retval] LONG* pNumberVal);
[propget, id(6)] HRESULT NumPoints([out, retval] LONG* pNumberVal);
[propget, id(7)] HRESULT Coordinates([out, retval] ICartoCoordinate** pVal);
};
The *.h file
class ATL_NO_VTABLE CCartoPoint :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CCartoPoint, &CLSID_CartoPoint>,
public IDispatchImpl<ICartoPoint, &IID_ICartoPoint, &LIBID_GeometryObjectLib, 1, 0>,
public IDispatchImpl<ICartoGeometry, &IID_ICartoGeometry, &LIBID_GeometryObjectLib, 1, 0>
{
public:
CCartoPoint()
{
m_pCoordinate = new Coordinate(0,0);
GeometryFactory factory;
m_pPoint = factory.createPoint(*m_pCoordinate);
}
CCartoPoint(DOUBLE x, DOUBLE y)
{
m_pCoordinate = new Coordinate(x,y);
GeometryFactory factory;
m_pPoint = factory.createPoint(*m_pCoordinate);
}
DECLARE_REGISTRY_RESOURCEID(IDR_CARTOPOINT)
BEGIN_COM_MAP(CCartoPoint)
COM_INTERFACE_ENTRY(ICartoPoint)
COM_INTERFACE_ENTRY2(IDispatch,ICartoPoint)
COM_INTERFACE_ENTRY(ICartoGeometry)
END_COM_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
STDMETHOD(get_X)(DOUBLE* pVal);
STDMETHOD(put_X)(DOUBLE newVal);
STDMETHOD(get_Y)(DOUBLE* pVal);
STDMETHOD(put_Y)(DOUBLE newVal);
public:
STDMETHOD(get_Area)(DOUBLE* pAreaVal);
STDMETHOD(get_Centroid)( ICartoPoint** pCentroidVal);
STDMETHOD(get_GeometryType)( cartoGeometryType* pTypeVal);
STDMETHOD(get_NumGeometries)(LONG* pNumberVal);
STDMETHOD(get_NumPoints)( LONG* pNumberVal);
STDMETHOD(get_Coordinates)(ICartoCoordinate** pVal);
private:
Point* m_pPoint;
Coordinate* m_pCoordinate;
};
OBJECT_ENTRY_AUTO(__uuidof(CartoPoint), CCartoPoint)
The *.cpp file
STDMETHODIMP CCartoPoint::get_X(DOUBLE* pVal)
{
return S_OK;
}
STDMETHODIMP CCartoPoint::put_X(DOUBLE newVal)
{
return S_OK;
}
STDMETHODIMP CCartoPoint::get_Y(DOUBLE* pVal)
{
return S_OK;
}
STDMETHODIMP CCartoPoint::put_Y(DOUBLE newVal)
{
return S_OK;
}
STDMETHODIMP CCartoPoint::get_Area(DOUBLE* pAreaVal)
{
return S_OK;
}
STDMETHODIMP CCartoPoint::get_Centroid( ICartoPoint** pCentroidVal)
{
CCartoPoint pt;
return S_OK;
}
STDMETHODIMP CCartoPoint::get_GeometryType( cartoGeometryType* pTypeVal)
{
return S_OK;
}
STDMETHODIMP CCartoPoint::get_NumGeometries(LONG* pNumberVal)
{
return S_OK;
}
STDMETHODIMP CCartoPoint::get_NumPoints( LONG* pNumberVal)
{
return S_OK;
}
STDMETHODIMP CCartoPoint::get_Coordinates(ICartoCoordinate** pVal)
{
return S_OK;
}