172 lines
3.4 KiB
C++
172 lines
3.4 KiB
C++
/***
|
|
*dspcalc2.h
|
|
*
|
|
* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
|
|
* Information Contained Herein Is Proprietary and Confidential.
|
|
*
|
|
*Purpose:
|
|
*
|
|
*
|
|
*Implementation Notes:
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#include "hostenv.h"
|
|
#include "resource.h"
|
|
#include "clsid.h"
|
|
|
|
#ifndef CLASS
|
|
# ifdef __TURBOC__
|
|
# define CLASS class huge
|
|
# else
|
|
# define CLASS class FAR
|
|
# endif
|
|
#endif
|
|
|
|
#pragma warning(disable:4355)
|
|
|
|
#ifdef _MAC
|
|
typedef void * LPVOID;
|
|
typedef unsigned long ULONG;
|
|
typedef int BOOL;
|
|
typedef unsigned int UINT;
|
|
typedef unsigned short WORD;
|
|
typedef unsigned char BYTE;
|
|
typedef unsigned long DWORD;
|
|
typedef long LONG;
|
|
#define FALSE 0
|
|
#define TRUE 1
|
|
#define NEAR
|
|
#endif
|
|
|
|
#ifdef _MAC
|
|
# define UNUSED(X) ((void)(void*)&(X))
|
|
#else
|
|
# define UNUSED(X) (X)
|
|
#endif
|
|
|
|
|
|
/*
|
|
* The .h file included below is created via MkTypLib
|
|
*/
|
|
#include "calctype.h"
|
|
|
|
#pragma warning(disable:4355)
|
|
|
|
#define DIM(X) (sizeof(X)/sizeof(X[0]))
|
|
|
|
|
|
// forward decl
|
|
CLASS CCalc;
|
|
|
|
|
|
// Introduced "calculator" interface
|
|
//
|
|
// This nested class implementes core arithmetic functionality
|
|
// (such as it is) *and* is the interface that will be exposed via
|
|
// IDispatch for external programmability.
|
|
//
|
|
CLASS CArith : public _ICalculator {
|
|
public:
|
|
|
|
/* IUnknown methods */
|
|
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR * ppvObj);
|
|
STDMETHOD_(ULONG, AddRef)(THIS);
|
|
STDMETHOD_(ULONG, Release)(THIS);
|
|
|
|
/* ICalculator methods */
|
|
STDMETHOD_(void, put_Accum)(long l);
|
|
STDMETHOD_(long, get_Accum)(void);
|
|
STDMETHOD_(void, put_Opnd)(long l);
|
|
STDMETHOD_(long, get_Opnd)(void);
|
|
STDMETHOD_(void, put_Op)(OPERATORS op);
|
|
STDMETHOD_(OPERATORS, get_Op)(void);
|
|
STDMETHOD_(VARIANT_BOOL, Eval)(void);
|
|
STDMETHOD_(void, Clear)(void);
|
|
STDMETHOD_(void, Display)(void);
|
|
STDMETHOD_(void, Quit)(void);
|
|
STDMETHOD_(VARIANT_BOOL, Button)(SAFEARRAY FAR* psa);
|
|
|
|
// the following method is internal, and not exposed for programmability
|
|
BOOL ButtonPush(int button);
|
|
|
|
CArith(CCalc FAR* pcalc){
|
|
m_pcalc = pcalc;
|
|
Clear();
|
|
}
|
|
|
|
enum states { STATE_LOPND, STATE_OP, STATE_ROPND, STATE_EVAL };
|
|
|
|
private:
|
|
CCalc FAR* m_pcalc;
|
|
OPERATORS m_op;
|
|
long m_opnd;
|
|
long m_accum;
|
|
enum states m_state;
|
|
};
|
|
|
|
|
|
CLASS CCalc : public IUnknown {
|
|
public:
|
|
friend CArith;
|
|
|
|
static CCalc FAR* Create();
|
|
|
|
STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
|
|
STDMETHOD_(ULONG, AddRef)(void);
|
|
STDMETHOD_(ULONG, Release)(void);
|
|
|
|
CCalc() : m_arith(this)
|
|
{
|
|
m_refs = 0;
|
|
#ifdef _MAC
|
|
m_pdlg = nil;
|
|
#else
|
|
m_hwnd = 0;
|
|
#endif
|
|
m_punkStdDisp = NULL;
|
|
}
|
|
|
|
#ifdef _MAC
|
|
DialogPtr m_pdlg;
|
|
#else
|
|
HWND m_hwnd;
|
|
#endif
|
|
CArith m_arith;
|
|
|
|
private:
|
|
ULONG m_refs;
|
|
IUnknown FAR* m_punkStdDisp;
|
|
};
|
|
|
|
|
|
// the CCalc Class Factory
|
|
//
|
|
CLASS CCalcCF : public IClassFactory {
|
|
public:
|
|
static IClassFactory FAR* Create();
|
|
|
|
STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
|
|
STDMETHOD_(ULONG, AddRef)(void);
|
|
STDMETHOD_(ULONG, Release)(void);
|
|
|
|
STDMETHOD(CreateInstance)(
|
|
IUnknown FAR* punkOuter, REFIID riid, void FAR* FAR* ppv);
|
|
#ifdef _MAC
|
|
STDMETHOD(LockServer)(unsigned long fLock);
|
|
#else
|
|
STDMETHOD(LockServer)(BOOL fLock);
|
|
#endif
|
|
|
|
CCalcCF() { m_refs = 1; }
|
|
|
|
private:
|
|
ULONG m_refs;
|
|
};
|
|
|
|
extern HRESULT InitOle(void);
|
|
extern HRESULT UninitOle(void);
|
|
|
|
extern CCalc FAR* g_pcalc;
|
|
|