POINT.CPP (LINES OLE Sample)

/*************************************************************************

  • OLE Automation Points Object.

  • point.cpp

  • CPoint implementation

  • Written by Microsoft Product Support Services, Windows Developer Support

  • (c) Copyright Microsoft Corp. 1994 All Rights Reserved

  • ***********************************************************************/

#include <windows.h>

#include <windowsx.h>

#ifdef WIN16

#include <ole2.h>

#include <compobj.h>

#include <dispatch.h>

#include <variant.h>

#include <olenls.h>

#endif

#include "lines.h"

/*

* CPoint::Create

*

* Purpose:

* Creates an instance of the Point automation object and initializes it.

*

* Parameters:

* ppPoint Returns Point automation object.

*

* Return Value:

* HRESULT

*

*/

HRESULT

CPoint::Create(CPoint FAR* FAR* ppPoint )

{

HRESULT hr;

CPoint FAR* pPoint = NULL;

*ppPoint = NULL;

pPoint = new CPoint();

if (pPoint == NULL)

goto error;

// Load type information for the point from type library.

hr = LoadTypeInfo(&pPoint->m_ptinfo, IID_IPoint);

if (FAILED(hr))

goto error;

*ppPoint = pPoint;

return NOERROR;

error:

if (pPoint == NULL)

return ResultFromScode(E_OUTOFMEMORY);

if (pPoint->m_ptinfo)

pPoint->m_ptinfo->Release();

// Set to NULL to prevent destructor from attempting to free again

pPoint->m_ptinfo = NULL;

delete pPoint;

return hr;

}

/*

* CPoint::CPoint

*

* Purpose:

* Constructor for CPoint object. Initializes members to NULL.

*

*/

#pragma warning (disable : 4355)

CPoint::CPoint() : m_SupportErrorInfo(this, IID_IPoint)

#pragma warning (default : 4355)

{

m_cRef = 0;

m_cInternalRef = 0;

m_ptinfo = NULL;

m_nX = -1;

m_nY = -1;

}

/*

* CPoint::~CPoint

*

* Purpose:

* Destructor for CPoint object. Frees Point message BSTR and default

* IDispatch implementation. Closes the aplication.

*

*/

CPoint::~CPoint()

{

if (m_ptinfo) m_ptinfo->Release();

}

/*

* CPoint::QueryInterface, AddRef, Release

*

* Purpose:

* Implements IUnknown::QueryInterface, AddRef, Release

*

*/

STDMETHODIMP

CPoint::QueryInterface(REFIID iid, void FAR* FAR* ppv)

{

*ppv = NULL;

if (iid == IID_IUnknown || iid == IID_IDispatch || iid == IID_IPoint)

*ppv = this;

else if (iid == IID_ISupportErrorInfo)

*ppv = &m_SupportErrorInfo;

else return ResultFromScode(E_NOINTERFACE);

AddRef();

return NOERROR;

}

STDMETHODIMP_(ULONG)

CPoint::AddRef(void)

{

#ifdef _DEBUG

TCHAR ach[50];

wsprintf(ach, TEXT("Ref = %ld, Point\r\n"), m_cRef+1);

OutputDebugString(ach);

#endif

return ++m_cRef;

}

STDMETHODIMP_(ULONG)

CPoint::Release(void)

{

#ifdef _DEBUG

TCHAR ach[50];

wsprintf(ach, TEXT("Ref = %ld, Point\r\n"), m_cRef-1);

OutputDebugString(ach);

#endif

if(--m_cRef == 0)

{

delete this;

return 0;

}

return m_cRef;

}

/*

* CPoint::GetTypeInfoCount

*

* Purpose:

* Implements IDispatch::GetTypeInfoCount.

*

*/

STDMETHODIMP

CPoint::GetTypeInfoCount(UINT FAR* pctinfo)

{

*pctinfo = 1;

return NOERROR;

}

/*

* CPoint::GetTypeInfo

*

* Purpose:

* Implements IDispatch::GetTypeInfo.

*

*/

STDMETHODIMP

CPoint::GetTypeInfo(

UINT itinfo,

LCID lcid,

ITypeInfo FAR* FAR* pptinfo)

{

*pptinfo = NULL;

if(itinfo != 0)

return ResultFromScode(DISP_E_BADINDEX);

m_ptinfo->AddRef();

*pptinfo = m_ptinfo;

return NOERROR;

}

/*

* CPoint::GetIDsOfNames

*

* Purpose:

* Implements IDispatch::GetIDsOfNames. The standard implementation, DispGetIDsOfNames,

* is used.

*

*/

STDMETHODIMP

CPoint::GetIDsOfNames(

REFIID riid,

OLECHAR FAR* FAR* rgszNames,

UINT cNames,

LCID lcid,

DISPID FAR* rgdispid)

{

return DispGetIDsOfNames(m_ptinfo, rgszNames, cNames, rgdispid);

}

/*

* CPoint::Invoke

*

* Purpose:

* Implements IDispatch::Invoke. The standard implementation, DispInvoke,

* is used.

*

*/

STDMETHODIMP

CPoint::Invoke(

DISPID dispidMember,

REFIID riid,

LCID lcid,

WORD wFlags,

DISPPARAMS FAR* pdispparams,

VARIANT FAR* pvarResult,

EXCEPINFO FAR* pexcepinfo,

UINT FAR* puArgErr)

{

return DispInvoke(

this, m_ptinfo,

dispidMember, wFlags, pdispparams,

pvarResult, pexcepinfo, puArgErr);

}

STDMETHODIMP

CPoint::get_x(int FAR* pnX)

{

*pnX = m_nX;

return NOERROR;

}

STDMETHODIMP

CPoint::put_x(int nX)

{

m_nX = nX;

return NOERROR;

}

STDMETHODIMP

CPoint::get_y(int FAR* pnY)

{

*pnY = m_nY;

return NOERROR;

}

STDMETHODIMP

CPoint::put_y(int nY)

{

m_nY = nY;

return NOERROR;

}

/*

*

* The following methods are not exposed through Automation

*

*/

/*

* CPoint::InternalAddRef, InternalRelease

*

* Purpose:

* Implements an internal ref count for the use of the points collection.

* The points collection does not have duplicates, instead a reference count is incremented.

* A point is removed from the collection when the reference count drops to 0.

*

*/

STDMETHODIMP_(ULONG)

CPoint::InternalAddRef(void)

{

#ifdef _DEBUG

TCHAR ach[50];

wsprintf(ach, TEXT("Internal Ref = %ld, Point\r\n"), m_cInternalRef+1);

OutputDebugString(ach);

#endif

return ++m_cInternalRef;

}

STDMETHODIMP_(ULONG)

CPoint::InternalRelease(void)

{

#ifdef _DEBUG

TCHAR ach[50];

wsprintf(ach, TEXT("Internal Ref = %ld, Point\r\n"), m_cInternalRef-1);

OutputDebugString(ach);

#endif

return --m_cInternalRef;

}

STDMETHODIMP_(int)

CPoint::get_x(void)

{

return m_nX;

}

STDMETHODIMP_(int)

CPoint::get_y(void)

{

return m_nY;

}

Software for developers
Delphi Components
.Net Components
Software for Android Developers
More information resources
MegaDetailed.Net
Unix Manual Pages
Delphi Examples
Databases for Amazon shops developers
Amazon Categories Database
Browse Nodes Database