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