|
|
1.1 root 1: /***
2: *misc.cpp
3: *
4: * Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
5: *
6: *Purpose:
7: * This module contains a the of IDispatch related helper(s) that
8: * are common to both the CPoly and CPoint implementations of IDispatch.
9: *
10: *Implementation Notes:
11: *
12: *****************************************************************************/
13:
14: #include "spoly.h"
15: #include "cpoint.h"
16: #include "cpoly.h"
17:
18: #include <stdio.h>
19:
20: #if _MAC
21: # include <string.h>
22: # include <ctype.h>
23: #endif
24:
25: int g_fExitOnLastRelease = 0;
26:
27: unsigned long g_dwPolyCF = 0;
28: unsigned long g_dwPointCF = 0;
29:
30: IClassFactory FAR* g_ppolyCF = NULL;
31: IClassFactory FAR* g_ppointCF = NULL;
32:
33:
34: void
35: Assert(int fCond, char FAR* file, int line, char FAR* message)
36: {
37: char * fmt;
38: char buf[128];
39:
40: if(fCond)
41: return;
42:
43: fmt = (message == NULL)
44: ? "Assertion failed: %s(%d)"
45: : "Assertion failed: %s(%d) '%s'";
46: sprintf(buf, fmt, file, line, message);
47:
48: #ifdef _MAC
49: DebugStr(c2pstr(buf));
50: #else
51: OutputDebugString(buf);
52: DebugBreak();
53: #endif
54: }
55:
56:
57: #ifdef WIN32
58:
59: //---------------------------------------------------------------------
60: // ASCII NLS Wrapper Functions (for Win32)
61: //---------------------------------------------------------------------
62:
63: static int WINAPI
64: CompareStringA(
65: LCID lcid,
66: DWORD dwFlags,
67: LPSTR lpStr1, int cch1,
68: LPSTR lpStr2, int cch2)
69: {
70: WCHAR lpwStr1[32], lpwStr2[32];
71:
72: MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpStr1, cch1, lpwStr1, 32);
73: MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpStr2, cch2, lpwStr2, 32);
74: return(CompareStringW(lcid, dwFlags, lpwStr1, cch1, lpwStr2, cch2));
75: }
76:
77: #endif
78:
79:
80: #ifdef _MAC
81: pascal int stricmp(char *first, char *last)
82: {
83: unsigned short f, l;
84:
85: do{
86: f = tolower(*first++);
87: l = tolower(*last++);
88: }while(f && f == l);
89:
90: return f - l;
91: }
92: #endif
93:
94:
95: /***
96: *HRESULT InitOle(void)
97: *Purpose:
98: * Initialize Ole, and register our class factories.
99: *
100: *Entry:
101: * None
102: *
103: *Exit:
104: * None
105: *
106: ***********************************************************************/
107: STDAPI
108: InitOle()
109: {
110: HRESULT hresult;
111:
112: if((hresult = OleInitialize(NULL)) != NOERROR)
113: goto LError0;
114:
115: // Register the CPoint Class Factory
116: //
117: if((g_ppointCF = CPointCF::Create()) == NULL){
118: hresult = ResultFromScode(E_OUTOFMEMORY);
119: goto LError1;
120: }
121:
122: hresult = CoRegisterClassObject(
123: CLSID_CPoint,
124: g_ppointCF,
125: CLSCTX_LOCAL_SERVER,
126: REGCLS_MULTIPLEUSE,
127: &g_dwPointCF);
128: if(hresult != NOERROR)
129: goto LError1;
130:
131: // Register the CPoly Class Factory.
132: //
133: if((g_ppolyCF = CPolyCF::Create()) == NULL){
134: hresult = ResultFromScode(E_OUTOFMEMORY);
135: goto LError1;
136: }
137:
138: hresult = CoRegisterClassObject(
139: CLSID_CPoly,
140: g_ppolyCF,
141: CLSCTX_LOCAL_SERVER,
142: REGCLS_MULTIPLEUSE,
143: &g_dwPolyCF);
144: if(hresult != NOERROR)
145: goto LError1;
146:
147: g_ppolyCF->Release();
148:
149: g_ppointCF->Release();
150:
151: return NOERROR;
152:
153:
154: LError1:;
155: if(g_ppolyCF != NULL)
156: g_ppolyCF->Release();
157:
158: if(g_ppointCF != NULL)
159: g_ppointCF->Release();
160:
161: UninitOle();
162:
163: LError0:;
164: return hresult;
165: }
166:
167:
168: STDAPI
169: UninitOle()
170: {
171: // Tell Ole to release our class factories.
172: //
173: if(g_dwPointCF != 0L)
174: CoRevokeClassObject(g_dwPointCF);
175:
176: if(g_dwPolyCF != 0L)
177: CoRevokeClassObject(g_dwPolyCF);
178:
179: OleUninitialize();
180:
181: return NOERROR;
182: }
183:
184:
185: /***
186: *HRESULT SPolyGetIDsOfNames(MEMBERDESC*, unsigned int, char**, unsigned int, LCID, long*)
187: *Purpose:
188: * This is the table driven implementation of IDispatch::GetIDsOfNames
189: * deferred to by both the CPoint and CPoly objects.
190: *
191: *Entry:
192: * rgmd = pointer to an array of method descriptors
193: * cMethods = number of elements in the array of method descriptors
194: * rgszNames = pointer to an array of names
195: * cNames = the number of names in the rgszNames array
196: * lcid = the callers locale ID
197: *
198: *Exit:
199: * return value = HRESULT
200: * rgdispid = array of name IDs corresponding to the rgszNames array
201: * this array will contain -1 for each entry that is not known.
202: *
203: ***********************************************************************/
204: STDAPI
205: SPolyGetIDsOfNames(
206: MEMBERDESC FAR* rgmd,
207: unsigned int cMethods,
208: char FAR* FAR* rgszNames,
209: unsigned int cNames,
210: LCID lcid,
211: DISPID FAR* rgdispid)
212: {
213: HRESULT hresult;
214: PARAMDESC FAR* ppd;
215: MEMBERDESC FAR* pmd;
216: unsigned int iName, iTry, cParams;
217:
218: hresult = NOERROR;
219:
220: // first lookup the member name.
221: //
222: for(pmd = rgmd;; ++pmd){
223: if(pmd == &rgmd[cMethods])
224: goto LMemberNotFound;
225:
226: #ifdef _MAC
227: if(!stricmp(rgszNames[0], pmd->szName))
228: #else
229: if(CompareStringA(
230: lcid, NORM_IGNORECASE, rgszNames[0], -1, pmd->szName, -1) == 2)
231: #endif
232: {
233: rgdispid[0] = pmd->id;
234: break;
235: }
236: }
237:
238: // Lookup the named parameters, if there are any.
239: if(cNames > 1){
240: cParams = pmd->cParams;
241: for(iName = 1; iName < cNames; ++iName){
242: for(iTry = 0;; ++iTry){
243: if(iTry == cParams){
244: hresult = ResultFromScode(DISP_E_UNKNOWNNAME);
245: rgdispid[iName] = -1;
246: break;
247: }
248: ppd = &pmd->rgpd[iTry];
249:
250: #ifdef _MAC
251: if(!stricmp(rgszNames[iName], ppd->szName))
252: #else
253: if(CompareStringA(
254: lcid, NORM_IGNORECASE, rgszNames[iName], -1, ppd->szName, -1) == 2)
255: #endif
256: {
257: // The DISPID for a named parameter is defined to be its
258: // zero based positional index. This routine assumes that
259: // that PARAMDESC array was declared in correct textual order.
260: //
261: rgdispid[iName] = iTry-1;
262: break;
263: }
264: }
265: }
266: }
267:
268: return hresult;
269:
270: LMemberNotFound:;
271: // If the member name is unknown, everything is unknown.
272: for(iName = 0; iName < cNames; ++iName)
273: rgdispid[iName] = -1;
274: return ResultFromScode(DISP_E_UNKNOWNNAME);
275: }
276:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.