LINES.H (LINES OLE Sample)

#ifdef WIN32

#ifdef UNICODE

#define FROM_OLE_STRING(str) str

#define TO_OLE_STRING(str) str

#else

#define FROM_OLE_STRING(str) ConvertToAnsi(str)

char* ConvertToAnsi(OLECHAR FAR* szW);

#define TO_OLE_STRING(str) ConvertToUnicode(str)

OLECHAR* ConvertToUnicode(char FAR* szA);

// Maximum length of string that can be converted between Ansi & Unicode

#define STRCONVERT_MAXLEN 300

#endif

#else // WIN16

#define APIENTRY far pascal

#define TCHAR char

#define TEXT(sz) sz

#define FROM_OLE_STRING(str) str

#define TO_OLE_STRING(str) str

#define LPTSTR LPSTR

// Windows NT defines the following in windowsx.h

#define GET_WM_COMMAND_ID(w,l) (w)

#define GET_WM_COMMAND_CMD(w,l) HIWORD(l)

#define GET_WM_COMMAND_HWND(w,l) LOWORD(l)

#endif

#include "tlb.h"

#define STRICT

// Menu IDs

#define IDM_DRAWLINE 101

#define IDM_CLEAR 102

#define IDM_EXIT 103

// Dialog ID

#define IDD_DRAWLINE 101

// Icon ID

#define IDI_ICON 102

// Dialog Control IDs

#define IDC_THICKNESS 101

#define IDC_CHOOSECOLOR 102

#define IDC_STARTPOINT_X 103

#define IDC_STARTPOINT_Y 104

#define IDC_ENDPOINT_X 105

#define IDC_ENDPOINT_Y 106

#define IDC_STATIC -1

// MAX len of string table entries

#define STR_LEN 200

// String table constants

#define IDS_Name 1

#define IDS_ErrorLoadingTypeLib 2

#define IDS_ProgID 3

#define IDS_Unexpected 1001

#define IDS_OutOfMemory 1002

#define IDS_InvalidIndex 1003

#define IDS_CollectionFull 1004

#define IDS_LineFromOtherInstance 1005

#define IDS_CantAddEndPoints 1006

#define IDS_PointFromOtherInstance 1007

#define IDS_NoVisibleXCoordinate 1008

#define IDS_NoVisibleYCoordinate 1009

#define IDS_NoStartPoint 1010

#define IDS_NoEndPoint 1011

// SCODEs for the Lines Application. This is required for vtable-binding

// Automation objects want to return custom HRESULTs. All the OLE-defined

// FACILITY_ITF codes have a code value which lies in the region 0x0000-0x01FFF.

// While it is legal for the definer to use any code, it is highly recommended

// that only code values in the range 0x0200-0xFFFF be used, as this will reduce the

// possiblity of accidental confusion with any OLE-defined errors.

#define LINES_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x0200)

#define LINES_E_UNEXPECTED (LINES_E_FIRST + 0x0)

// Unexpected error

#define LINES_E_OUTOFMEMORY (LINES_E_FIRST + 0x1)

// Out of memory

#define LINES_E_INVALIDINDEX (LINES_E_FIRST + 0x2)

// Invalid index to Points or Lines collections

#define LINES_E_COLLECTIONFULL (LINES_E_FIRST + 0x3)

// Points or Lines collection is full

#define LINES_E_LINEFROMOTHERINSTANCE (LINES_E_FIRST + 0x4)

// Line from another instance of this application cannot be added.

#define LINES_E_CANTADDENDPOINTS (LINES_E_FIRST + 0x5)

// End points of line cannot be added to collection. (Make sure line has two end points).

#define LINES_E_POINTFROMOTHERINSTANCE (LINES_E_FIRST + 0x6)

// Point from another instance of this application cannot be added.

#define LINES_E_NOVISIBLEXCOORDINATE (LINES_E_FIRST + 0x7)

// No visible X coordinate.

#define LINES_E_NOVISIBLEYCOORDINATE (LINES_E_FIRST + 0x8)

// No visible Y coordinate.

#define LINES_E_NOSTARTPOINT (LINES_E_FIRST + 0x9)

// Line does not have a start point.

#define LINES_E_NOENDPOINT (LINES_E_FIRST + 0xA)

// Line does not have an end point.

// Number of SCODEs

#define SCODE_COUNT 11

// Function prototypes

int APIENTRY WinMain (HINSTANCE, HINSTANCE, LPSTR, int);

BOOL InitApplication (HINSTANCE);

BOOL InitInstance (HINSTANCE);

BOOL ProcessCmdLine(LPSTR pCmdLine, LPDWORD pdwRegisterCF, LPDWORD pdwRegisterActiveObject, int nCmdShow);

  • oid Uninitialize(DWORD dwRegisterCF, DWORD dwRegisterActiveObject);

HRESULT LoadTypeInfo(ITypeInfo FAR* FAR* pptinfo, REFCLSID clsid);

#ifdef WIN16

extern "C" LRESULT __export CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM);

extern "C" BOOL __export CALLBACK DrawLineDialogFunc(HWND, UINT, WPARAM, LPARAM);

#else

extern "C" LRESULT CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM);

extern "C" BOOL CALLBACK DrawLineDialogFunc(HWND, UINT, WPARAM, LPARAM);

#endif

// Class definitions

class CPane;

class CLine;

class CPoint;

class CLines;

class CPoints;

// ISupportErrorInfo interface implementation

interface CSupportErrorInfo : public ISupportErrorInfo

{

public:

// IUnknown methods

STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);

STDMETHOD_(ULONG, AddRef)(void);

STDMETHOD_(ULONG, Release)(void);

// ISupportErrorInfo method

STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);

CSupportErrorInfo(IUnknown FAR* punkObject, REFIID riid);

private:

LPUNKNOWN m_punkObject; // IUnknown of Object that implements this interface

GUID m_iid;

};

class FAR CApplicationCF : public IClassFactory

{

public:

// IUnknown methods

STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);

STDMETHOD_(ULONG, AddRef)(void);

STDMETHOD_(ULONG, Release)(void);

// IClassFactory methods

STDMETHOD(CreateInstance)(IUnknown FAR* punkOuter, REFIID riid,

void FAR* FAR* ppv);

STDMETHOD(LockServer)(BOOL fLock);

CApplicationCF();

private:

ULONG m_cRef; // Reference count

};

class FAR CApplication : public IApplication

{

public:

/* IUnknown methods */

STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);

STDMETHOD_(ULONG, AddRef)();

STDMETHOD_(ULONG, Release)();

/* IDispatch methods */

STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo);

STDMETHOD(GetTypeInfo)(

UINT itinfo,

LCID lcid,

ITypeInfo FAR* FAR* pptinfo);

STDMETHOD(GetIDsOfNames)(

REFIID riid,

OLECHAR FAR* FAR* rgszNames,

UINT cNames,

LCID lcid,

DISPID FAR* rgdispid);

STDMETHOD(Invoke)(

DISPID dispidMember,

REFIID riid,

LCID lcid,

WORD wFlags,

DISPPARAMS FAR* pdispparams,

VARIANT FAR* pvarResult,

EXCEPINFO FAR* pexcepinfo,

UINT FAR* puArgErr);

/* IApplication automation exposed properties and methods */

STDMETHOD(get_Application)(IApplication FAR* FAR* ppApplication);

STDMETHOD(get_FullName)(BSTR FAR* pbstr);

STDMETHOD(get_Name)(BSTR FAR* pbstr);

STDMETHOD(get_Parent)(IApplication FAR* FAR* ppApplication);

STDMETHOD(put_Visible)(VARIANT_BOOL bVisible);

STDMETHOD(get_Visible)(VARIANT_BOOL FAR* pbVisible);

STDMETHOD(Quit)();

STDMETHOD(get_Pane)(IPane FAR* FAR* ppPane);

STDMETHOD(CreateLine)(ILine FAR* FAR* ppLine);

STDMETHOD(CreatePoint)(IPoint FAR* FAR* ppPoint);

/* CApplication methods */

STDMETHOD_(void, Draw)();

STDMETHOD_(void, OnSize)(unsigned int nWidth, unsigned int nHeight);

STDMETHOD_(void, ShowWindow)(int nCmdShow);

STDMETHOD_(void, CreateAndDrawLine)();

STDMETHOD_(void, ClearPane)();

STDMETHOD(RaiseException)(int nID);

static HRESULT Create(HWND hwnd, CApplication FAR* FAR* ppApplication); // Creates and intializes Applicaton object

CApplication();

~CApplication();

public:

HWND m_hwnd; // Application window.

HINSTANCE m_hinst; // Hinstance of application.

BSTR m_bstrName; // Name of application.

BSTR m_bstrProgID; // ProgID of application.

BOOL m_bUserClosing; // User is closing the application.

private:

LPTYPEINFO m_ptinfo; // Type information of IApplication interface.

BSTR m_bstrFullName; // Full name of application.

BOOL m_bVisible; // Is window visible?

CPane FAR* m_pPane; // Pointer to the Pane object.

EXCEPINFO m_excepinfo; // Information to raise an exception on error.

BOOL m_bRaiseException; // Properties and methods use this to signal that an exception is to be raised.

ULONG m_cRef; // Reference count.

CSupportErrorInfo m_SupportErrorInfo; // ISupportErrorInfo interface implementation

};

class FAR CPane : public IPane

{

public:

/* IUnknown methods */

STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);

STDMETHOD_(ULONG, AddRef)();

STDMETHOD_(ULONG, Release)();

/* IDispatch methods */

STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo);

STDMETHOD(GetTypeInfo)(

UINT itinfo,

LCID lcid,

ITypeInfo FAR* FAR* pptinfo);

STDMETHOD(GetIDsOfNames)(

REFIID riid,

OLECHAR FAR* FAR* rgszNames,

UINT cNames,

LCID lcid,

DISPID FAR* rgdispid);

STDMETHOD(Invoke)(

DISPID dispidMember,

REFIID riid,

LCID lcid,

WORD wFlags,

DISPPARAMS FAR* pdispparams,

VARIANT FAR* pvarResult,

EXCEPINFO FAR* pexcepinfo,

UINT FAR* puArgErr);

/* IPane automation exposed properties & methods */

STDMETHOD(get_Lines)(ILines FAR* FAR* ppLines);

STDMETHOD(get_Points)(IPoints FAR* FAR* ppPoints);

STDMETHOD(get_MaxX)(int FAR* pnMaxX);

STDMETHOD(get_MaxY)(int FAR* pnMaxY);

STDMETHOD(Clear)();

STDMETHOD(Refresh)();

/* CPane methods */

STDMETHOD_(void, Draw)();

STDMETHOD_(void, OnSize)(unsigned int nWidth, unsigned int nHeight);

STDMETHOD_(HDC, GetDC)();

STDMETHOD_(void, ReleaseDC)(HDC hdc);

STDMETHOD_(void, InvalidateRect)(LPRECT prc);

STDMETHOD_(void, Update)(void);

STDMETHOD_(BOOL, AddPoint)(CPoint FAR* pPoint);

STDMETHOD_(void, RemovePoint)(CPoint FAR* pPoint);

STDMETHOD(RaiseException)(int nID);

static HRESULT Create(HWND hwnd, CPane FAR* FAR* ppPane); // Creates and intializes Pane object

CPane();

~CPane();

private:

LPTYPEINFO m_ptinfo; // Type information of IPane interface.

HWND m_hwnd; // Main window.

CLines FAR *m_pLines; // Lines collection.

CPoints FAR* m_pPoints; // Points collection.

int m_nMaxX; // Maximum visible X coordinate in twips.

int m_nMaxY; // Maximum visible Y coordinate in twips.

int m_nWidth; // Width of pane in twips.

int m_nHeight; // Height of pane in twips.

EXCEPINFO m_excepinfo; // Information to raise an exception on error.

BOOL m_bRaiseException; // Properties and methods use this to signal that an exception is to be raised.

ULONG m_cRef; // Reference count.

CSupportErrorInfo m_SupportErrorInfo; // ISupportErrorInfo interface implementation

};

class FAR CLine : public ILine

{

public:

/* IUnknown methods */

STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);

STDMETHOD_(ULONG, AddRef)();

STDMETHOD_(ULONG, Release)();

/* IDispatch methods */

STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo);

STDMETHOD(GetTypeInfo)(

UINT itinfo,

LCID lcid,

ITypeInfo FAR* FAR* pptinfo);

STDMETHOD(GetIDsOfNames)(

REFIID riid,

OLECHAR FAR* FAR* rgszNames,

UINT cNames,

LCID lcid,

DISPID FAR* rgdispid);

STDMETHOD(Invoke)(

DISPID dispidMember,

REFIID riid,

LCID lcid,

WORD wFlags,

DISPPARAMS FAR* pdispparams,

VARIANT FAR* pvarResult,

EXCEPINFO FAR* pexcepinfo,

UINT FAR* puArgErr);

/* ILine automation exposed properties & methods */

STDMETHOD(get_Color)(long FAR* plColorref);

STDMETHOD(put_Color)(long lColorref);

STDMETHOD(get_EndPoint)(IPoint FAR* FAR* ppPoint);

STDMETHOD(putref_EndPoint)(IPoint FAR* pPoint);

STDMETHOD(get_StartPoint)(IPoint FAR* FAR* ppPoint);

STDMETHOD(putref_StartPoint)(IPoint FAR* pPoint);

STDMETHOD(get_Thickness)(int FAR* pnThickness);

STDMETHOD(put_Thickness)(int nThickness);

/* CLine methods */

STDMETHOD_(void, Draw)(HDC hdc);

STDMETHOD_(void, GetInvalidateRect)(LPRECT prc);

STDMETHOD_(BOOL, AddEndPointsToPane)(CPane FAR* pPane);

STDMETHOD_(void, RemoveEndPointsFromPane)(CPane FAR* pPane);

STDMETHOD(RaiseException)(int nID);

static HRESULT Create(CLine FAR* FAR* ppLine); // Creates and intializes Line object

CLine();

~CLine();

private:

LPTYPEINFO m_ptinfo; // Type information of ILine interface.

COLORREF m_colorref; // RGB color of line.

CPoint FAR* m_pPointStart; // Start point of line.

CPoint FAR* m_pPointEnd; // End point of line.

int m_nThickness; // Line thickness in twips.

EXCEPINFO m_excepinfo; // Information to raise an exception on error.

BOOL m_bRaiseException; // Properties and methods use this to signal that an exception is to be raised.

ULONG m_cRef; // Reference count.

CSupportErrorInfo m_SupportErrorInfo; // ISupportErrorInfo interface implementation

};

class FAR CPoint : public IPoint

{

public:

/* IUnknown methods */

STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);

STDMETHOD_(ULONG, AddRef)();

STDMETHOD_(ULONG, Release)();

/* IDispatch methods */

STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo);

STDMETHOD(GetTypeInfo)(

UINT itinfo,

LCID lcid,

ITypeInfo FAR* FAR* pptinfo);

STDMETHOD(GetIDsOfNames)(

REFIID riid,

OLECHAR FAR* FAR* rgszNames,

UINT cNames,

LCID lcid,

DISPID FAR* rgdispid);

STDMETHOD(Invoke)(

DISPID dispidMember,

REFIID riid,

LCID lcid,

WORD wFlags,

DISPPARAMS FAR* pdispparams,

VARIANT FAR* pvarResult,

EXCEPINFO FAR* pexcepinfo,

UINT FAR* puArgErr);

/* IPoint automation exposed properties & methods */

STDMETHOD(get_x)(int FAR* pnX);

STDMETHOD(put_x)(int nX);

STDMETHOD(get_y)(int FAR* pnY);

STDMETHOD(put_y)(int nY);

/* CPoint methods */

STDMETHOD_(ULONG, InternalAddRef)();

STDMETHOD_(ULONG, InternalRelease)();

STDMETHOD_(int, get_x)();

STDMETHOD_(int, get_y)();

static HRESULT Create(CPoint FAR* FAR* ppPoint); // Creates and intializes Point object

CPoint();

~CPoint();

private:

LPTYPEINFO m_ptinfo; // Type information of IPoint interface.

int m_nX; // X coordinate of point in twips.

int m_nY; // Y coordinate of point in twips.

ULONG m_cInternalRef; // Reference count for the use of the Points collection only.

ULONG m_cRef; // Reference count.

CSupportErrorInfo m_SupportErrorInfo; // ISupportErrorInfo interface implementation

};

class FAR CLines : public ILines

{

public:

/* IUnknown methods */

STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);

STDMETHOD_(ULONG, AddRef)();

STDMETHOD_(ULONG, Release)();

/* IDispatch methods */

STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo);

STDMETHOD(GetTypeInfo)(

UINT itinfo,

LCID lcid,

ITypeInfo FAR* FAR* pptinfo);

STDMETHOD(GetIDsOfNames)(

REFIID riid,

OLECHAR FAR* FAR* rgszNames,

UINT cNames,

LCID lcid,

DISPID FAR* rgdispid);

STDMETHOD(Invoke)(

DISPID dispidMember,

REFIID riid,

LCID lcid,

WORD wFlags,

DISPPARAMS FAR* pdispparams,

VARIANT FAR* pvarResult,

EXCEPINFO FAR* pexcepinfo,

UINT FAR* puArgErr);

/* ILines automation exposed properties & methods */

STDMETHOD(Add)(ILine FAR* pLine);

STDMETHOD(get_Count)(long FAR* lCount);

STDMETHOD(get_Item)(long lIndex, ILine FAR* FAR* ppLine);

STDMETHOD(get__NewEnum)(IUnknown FAR* FAR* ppunkEnum);

STDMETHOD(Remove)(long lIndex);

/* CLines methods */

STDMETHOD_(void, Draw)(HDC hdc);

STDMETHOD_(void, Clear)();

STDMETHOD(RaiseException)(int nID);

static HRESULT Create(ULONG lMaxSize, long lLBound, CPane FAR* pPane, CLines FAR* FAR* ppLines); // Creates and intializes Lines object

CLines();

~CLines();

private:

LPTYPEINFO m_ptinfo; // Type information of ILines interface.

SAFEARRAY FAR *m_psa; // Safe array that holds Lines collection items.

ULONG m_cElements; // Number of items in Lines collection.

ULONG m_cMax; // Maximum number of items Lines collection can hold.

long m_lLBound; // Lower bound of index of Lines collection.

CPane FAR* m_pPane; // Pointer to the Pane object that contains this Lines collection.

EXCEPINFO m_excepinfo; // Information to raise an exception on error.

BOOL m_bRaiseException; // Properties and methods use this to signal that an exception is to be raised.

ULONG m_cRef; // Reference count.

CSupportErrorInfo m_SupportErrorInfo; // ISupportErrorInfo interface implementation

};

class FAR CPoints : public IPoints

{

public:

/* IUnknown methods */

STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);

STDMETHOD_(ULONG, AddRef)();

STDMETHOD_(ULONG, Release)();

/* IDispatch methods */

STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo);

STDMETHOD(GetTypeInfo)(

UINT itinfo,

LCID lcid,

ITypeInfo FAR* FAR* pptinfo);

STDMETHOD(GetIDsOfNames)(

REFIID riid,

OLECHAR FAR* FAR* rgszNames,

UINT cNames,

LCID lcid,

DISPID FAR* rgdispid);

STDMETHOD(Invoke)(

DISPID dispidMember,

REFIID riid,

LCID lcid,

WORD wFlags,

DISPPARAMS FAR* pdispparams,

VARIANT FAR* pvarResult,

EXCEPINFO FAR* pexcepinfo,

UINT FAR* puArgErr);

/* IPoints automation exposed properties & methods */

STDMETHOD(get_Count)(long FAR* plCount);

STDMETHOD(get_Item)(long lIndex, IPoint FAR* FAR* ppPoint);

STDMETHOD(get__NewEnum)(IUnknown FAR* FAR* ppunkEnum);

/* CPoints methods */

STDMETHOD_(BOOL, Add)(CPoint FAR* pPointNew);

STDMETHOD_(BOOL, Remove)(CPoint FAR* pPointRemove);

STDMETHOD_(void, Clear)();

STDMETHOD_(void, GetMaxXMaxY)(int FAR* pnX, int FAR* pnY, LPRECT prc);

STDMETHOD(RaiseException)(int nID);

static HRESULT Create(ULONG lMaxSize, long lLBound, CPane FAR* pPane, CPoints FAR* FAR* ppPoints); // Creates and intializes Points object

CPoints();

~CPoints();

private:

LPTYPEINFO m_ptinfo; // Type information of IPoints interface.

SAFEARRAY FAR *m_psa; // Safe array that holds Points collection items.

ULONG m_cElements; // Number of items in Points collection.

ULONG m_cMax; // Maximum number of items Points collection can hold.

long m_lLBound; // Lower bound of index of Points collection.

CPane FAR* m_pPane; // Pointer to the Pane object that contains this Points collection.

EXCEPINFO m_excepinfo; // Information to raise an exception on error.

BOOL m_bRaiseException; // Properties and methods use this to signal that an exception is to be raised.

ULONG m_cRef; // Reference count.

CSupportErrorInfo m_SupportErrorInfo; // ISupportErrorInfo interface implementation

};

class FAR CEnumVariant : public IEnumVARIANT

{

public:

// IUnknown methods

STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);

STDMETHOD_(ULONG, AddRef)();

STDMETHOD_(ULONG, Release)();

// IEnumVARIANT methods

STDMETHOD(Next)(ULONG cElements, VARIANT FAR* pvar, ULONG FAR* pcElementFetched);

STDMETHOD(Skip)(ULONG cElements);

STDMETHOD(Reset)();

STDMETHOD(Clone)(IEnumVARIANT FAR* FAR* ppenum);

static HRESULT Create(SAFEARRAY FAR*, ULONG, CEnumVariant FAR* FAR*); // Creates and intializes Enumerator

CEnumVariant();

~CEnumVariant();

private:

ULONG m_cRef; // Reference count

ULONG m_cElements; // Number of elements in enumerator.

long m_lLBound; // Lower bound of index.

long m_lCurrent; // Current index.

SAFEARRAY FAR* m_psa; // Safe array that holds elements.

};

// Structure filled by dialog from user input to create a line.

typedef struct _lineinfo

{

COLORREF colorref; // RGB color of line.

POINT ptStart; // Start point of line.

POINT ptEnd; // End point of line.

int nThickness; // Thickness of line.

} LINEINFO, FAR* LPLINEINFO;

extern CApplication FAR* g_pApplication;

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