|
|
1.1 root 1: /***
2: *dispcalc.h
3: *
4: * Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
5: * Information Contained Herein Is Proprietary and Confidential.
6: *
7: *Purpose:
8: * UNDONE
9: *
10: *
11: *Implementation Notes:
12: *
13: *****************************************************************************/
14:
15: #include "clsid.h"
16:
17: #ifndef CLASS
18: # ifdef __TURBOC__
19: # define CLASS class huge
20: # else
21: # define CLASS class FAR
22: # endif
23: #endif
24:
25: #pragma warning(disable:4355)
26:
27: #define DIM(X) (sizeof(X)/sizeof(X[0]))
28:
29:
30: enum operators {
31: OP_NONE = 0,
32: OP_PLUS,
33: OP_MINUS,
34: OP_MULT,
35: OP_DIV
36: };
37:
38:
39: CLASS CCalc : public IUnknown {
40: public:
41: static CCalc FAR* Create();
42:
43:
44: STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
45: STDMETHOD_(ULONG, AddRef)(void);
46: STDMETHOD_(ULONG, Release)(void);
47:
48:
49: // Introduced "calculator" interface
50: //
51: // This nested class implementes core arithmetic functionality
52: // (such as it is) *and* is the interface that will be exposed via
53: // IDispatch for external programmability.
54: //
55: CLASS CArith {
56: public:
57:
58: STDMETHOD_(void, put_Accum)(long l);
59: STDMETHOD_(long, get_Accum)(void);
60: STDMETHOD_(void, put_Opnd)(long l);
61: STDMETHOD_(long, get_Opnd)(void);
62: STDMETHOD_(void, put_Op)(short op);
63: STDMETHOD_(short, get_Op)(void);
64: STDMETHOD_(BOOL, Eval)(void);
65: STDMETHOD_(void, Clear)(void);
66: STDMETHOD_(void, Display)(void);
67: STDMETHOD_(void, Quit)(void);
68: STDMETHOD_(BOOL, Button)(BSTR button);
69:
70: // the following method is internal, and not exposed for programmability
71: BOOL ButtonPush(int button);
72:
73: CArith(CCalc FAR* pcalc){
74: m_pcalc = pcalc;
75: Clear();
76: }
77:
78: enum states { STATE_LOPND, STATE_OP, STATE_ROPND, STATE_EVAL };
79:
80: private:
81: CCalc FAR* m_pcalc;
82:
83: short m_op;
84: long m_opnd;
85: long m_accum;
86: enum states m_state;
87: };
88: friend CArith;
89: CArith m_arith;
90:
91:
92: HWND m_hwnd;
93:
94: CCalc() : m_arith(this)
95: {
96: m_refs = 1;
97: m_hwnd = 0;
98: m_punkStdDisp = NULL;
99: }
100:
101: private:
102: ULONG m_refs;
103: IUnknown FAR* m_punkStdDisp;
104: };
105:
106:
107: // the following enum defines method indices used by the
108: // default IDispatch implementation - DispInvoke().
109: //
110: // Note: these must match the order of the preceeding declarations
111: //
112: enum IMETH_CARITH {
113: IMETH_PUTACCUM = 0,
114: IMETH_GETACCUM,
115: IMETH_PUTOPERAND,
116: IMETH_GETOPERAND,
117: IMETH_PUTOPERATOR,
118: IMETH_GETOPERATOR,
119: IMETH_EVAL,
120: IMETH_CLEAR,
121: IMETH_DISPLAY,
122: IMETH_QUIT,
123: IMETH_BUTTON,
124:
125: // Define the "property" indices. these are defined to be
126: // the first index in a set/get property method pair. These
127: // definitions are used to build the METHODDATA that drives
128: // our implementation of IDispatch. see cdisp.cpp.
129: //
130: IMETH_ACCUM = IMETH_PUTACCUM,
131: IMETH_OPERAND = IMETH_PUTOPERAND,
132: IMETH_OPERATOR = IMETH_PUTOPERATOR
133: };
134:
135: // the following enum defines the IDs used by IDispatch
136: //
137: // Note: these values do *not* depend on order of declaration,
138: // but are sensitive to the kind of the method - ie, if a get/set
139: // method pair implements a property, then they need to share
140: // an ID.
141: //
142: // Note: by assigning "accum" the ID 'DISPID_VALUE', we are
143: // choosing to expose it as the default "value" property.
144: //
145: enum IDMEMBER_CARITH {
146: IDMEMBER_ACCUM = DISPID_VALUE, // the default property
147: IDMEMBER_OPERAND,
148: IDMEMBER_OPERATOR,
149: IDMEMBER_EVAL,
150: IDMEMBER_CLEAR,
151: IDMEMBER_DISPLAY,
152: IDMEMBER_QUIT,
153: IDMEMBER_BUTTON
154: };
155:
156:
157: // the CCalc Class Factory
158: //
159: CLASS CCalcCF : public IClassFactory {
160: public:
161: static IClassFactory FAR* Create();
162:
163: STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
164: STDMETHOD_(ULONG, AddRef)(void);
165: STDMETHOD_(ULONG, Release)(void);
166:
167: STDMETHOD(CreateInstance)(
168: IUnknown FAR* punkOuter, REFIID riid, void FAR* FAR* ppv);
169: STDMETHOD(LockServer)(BOOL fLock);
170:
171: CCalcCF() { m_refs = 1; }
172:
173: private:
174: ULONG m_refs;
175: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.