Annotation of mstools/ole20/samples/dispdemo/disphelp.cpp, revision 1.1.1.1

1.1       root        1: /*** 
                      2: *disphelp.cpp - IDispatch helpers
                      3: *
                      4: *  Copyright (C) 1992, Microsoft Corporation.  All Rights Reserved.
                      5: *  Information Contained Herein Is Proprietary and Confidential.
                      6: *
                      7: *Purpose:
                      8: *  This file contains several useful IDispatch related utilities.
                      9: *
                     10: *****************************************************************************/
                     11: 
                     12: #include <windows.h>
                     13: #include <ole2.h>
                     14: #include <dispatch.h>
                     15: 
                     16: #include <stdarg.h>
                     17: 
                     18: #include "disphelp.h"
                     19: 
                     20: // Adjust for WIN16/WIN32 synchronization
                     21: #if defined(WIN32) && !defined(OLE2FINAL)
                     22: #define E_FAIL E_UNSPEC
                     23: #endif
                     24: 
                     25: /* helper for DispBuildParams */
                     26: HRESULT PASCAL
                     27: CArgsOfFmt(DISPPARAMS FAR* pdispparams, char FAR* szFmt)
                     28: {
                     29:     char FAR* sz;
                     30: 
                     31:     pdispparams->cArgs = 0;
                     32:     pdispparams->cNamedArgs = 0;
                     33: 
                     34:     if(szFmt == NULL)
                     35:       return NOERROR;
                     36: 
                     37:     for(sz = szFmt; *sz != '\0'; ++sz){
                     38:       if(*sz == '&')
                     39:        ++sz;
                     40: 
                     41:       switch(*sz){
                     42:       case 'e':
                     43:       case 'n':
                     44:       case 'f':
                     45:       case 'i': case 'I':
                     46:       case 'r': case 'R':
                     47:       case 'c':
                     48:       case 'b':
                     49:       case 's':
                     50:       case 'd':
                     51:       case 'v':
                     52:       case 'D':
                     53:        ++pdispparams->cArgs;
                     54:        break;
                     55: 
                     56:       default:
                     57:        return ResultFromScode(E_INVALIDARG);
                     58:       }
                     59:     }
                     60: 
                     61:     return NOERROR;
                     62: }
                     63: 
                     64: 
                     65: /* helper for DispBuildParams */
                     66: VARTYPE PASCAL
                     67: VtOfFmtChar(char ch)
                     68: {
                     69:     switch(ch){
                     70:     case 'e': return VT_EMPTY;
                     71:     case 'n': return VT_NULL;
                     72:     case 'f': return VT_BOOL;
                     73:     case 'i': return VT_I2;
                     74:     case 'I': return VT_I4;
                     75:     case 'r': return VT_R4;
                     76:     case 'R': return VT_R8;
                     77:     case 'c': return VT_CY;
                     78:     case 'b': return VT_BSTR;
                     79:     case 's': return VT_ERROR;
                     80:     case 'd': return VT_DATE;
                     81:     case 'v': return VT_VARIANT;
                     82:     case 'U': return VT_UNKNOWN;
                     83:     case 'D': return VT_DISPATCH;
                     84:     }
                     85: 
                     86:     // REVIEW: this is really an error
                     87:     return VT_EMPTY;
                     88: }
                     89: 
                     90: 
                     91: /***
                     92: *PUBLIC DispBuildParams(DISPPARAMS**, UINT, DISPID*, char*, ...)
                     93: *Purpose:
                     94: *  Construct a DISPPARAMS struct based on the given format string.
                     95: *
                     96: *  '&' = mark the following record VT_BYREF
                     97: *
                     98: *  'e' = VT_EMPTY
                     99: *  'n' = VT_NULL
                    100: *  'f' = VT_BOOL       'f' as in flag
                    101: *  'i' = VT_I2
                    102: *  'I' = VT_I4
                    103: *  'r' = VT_R4
                    104: *  'R' = VT_R8
                    105: *  'c' = VT_CY
                    106: *  'b' = VT_BSTR
                    107: *  's' = VT_ERROR      's' as in scode
                    108: *  'd' = VT_DATE
                    109: *  'v' = VT_VARIANT
                    110: *  'D' = VT_DISPATCH
                    111: *  'U' = VT_UNKNOWN
                    112: *
                    113: #
                    114: *Entry:
                    115: *  UNDONE
                    116: *
                    117: *Exit:
                    118: *  UNDONE
                    119: *
                    120: ***********************************************************************/
                    121: extern "C" HRESULT FAR CDECL
                    122: DispBuildParams(
                    123:     DISPPARAMS FAR* FAR* ppdispparams,
                    124:     UINT cNamedArgs,
                    125:     DISPID FAR* rgdispid,
                    126:     char FAR* szFmt, ...)
                    127: {
                    128:     int ix;
                    129:     va_list args;
                    130:     char FAR* sz;
                    131:     HRESULT hresult;
                    132:     VARIANTARG FAR* pvarg;
                    133: 
                    134:     VARTYPE vt, vtMode;
                    135:     DISPPARAMS FAR* pdispparams;
                    136: 
                    137: 
                    138:     pdispparams = new DISPPARAMS;
                    139:     if(pdispparams == NULL)
                    140:       return ResultFromScode(E_OUTOFMEMORY);
                    141: 
                    142:     // compute the total number of arguments represented by the format
                    143:     // string, *and* validate the contents of the format string.
                    144:     //
                    145:     if((hresult = CArgsOfFmt(pdispparams, szFmt)) != NOERROR)
                    146:       goto LFreeDispParams;
                    147: 
                    148:     // the total number of arguments numst be >= the number of named args.
                    149:     //
                    150:     if(pdispparams->cArgs < cNamedArgs){
                    151:       hresult = ResultFromScode(E_INVALIDARG);
                    152:       goto LFreeDispParams;
                    153:     }
                    154:     pdispparams->cNamedArgs = cNamedArgs;
                    155: 
                    156:     pdispparams->rgvarg = new VARIANTARG[pdispparams->cArgs];
                    157:     if((pdispparams->rgvarg) == NULL){
                    158:       hresult = ResultFromScode(E_OUTOFMEMORY);
                    159:       goto LFreeDispParams;
                    160:     }
                    161: 
                    162:     if(pdispparams->cNamedArgs == 0){
                    163:       pdispparams->rgdispidNamedArgs = NULL;
                    164:     }else{
                    165:       pdispparams->rgdispidNamedArgs = new DISPID[pdispparams->cNamedArgs];
                    166:       if((pdispparams->rgdispidNamedArgs) == NULL){
                    167:         hresult = ResultFromScode(E_OUTOFMEMORY);
                    168:         goto LFreeRgVarg;
                    169:       }
                    170:       for(UINT i = 0; i < cNamedArgs; ++i)
                    171:        pdispparams->rgdispidNamedArgs[i] = rgdispid[cNamedArgs - i - 1];
                    172:     }
                    173: 
                    174:     va_start(args, szFmt);
                    175:     ix = pdispparams->cArgs;
                    176: 
                    177:     for(sz = szFmt; *sz != '\0'; ++sz){
                    178:       --ix;
                    179: 
                    180:       vtMode = 0;
                    181:       pvarg = &pdispparams->rgvarg[ix];
                    182: 
                    183:       if(*sz == '&'){
                    184:        ++sz;
                    185:        vtMode |= VT_BYREF;
                    186:       }
                    187: 
                    188:       vt = VtOfFmtChar(*sz);
                    189: 
                    190:       if(vtMode & VT_BYREF){
                    191: 
                    192:         V_BYREF(pvarg) = va_arg(args, void FAR*);
                    193: 
                    194:       }else{
                    195: 
                    196:         switch(*sz){
                    197:         case 'e':              // VT_EMPTY
                    198:          break;
                    199: 
                    200:         case 'n':              // VT_NULL
                    201:          V_I4(pvarg) = 0;
                    202:          break;
                    203: 
                    204:         case 'I':              // VT_I4
                    205:         case 's':              // VT_ERROR
                    206:          V_I4(pvarg) = va_arg(args, long);
                    207:          break;
                    208: 
                    209:         case 'f':              // VT_BOOL
                    210:         case 'i':              // VT_I2
                    211:           V_I2(pvarg) = va_arg(args, short);
                    212:          break;
                    213: 
                    214:         case 'r':              // VT_R4
                    215:           V_R4(pvarg) = (float)va_arg(args, double);
                    216:           break;
                    217: 
                    218:         case 'd':              // VT_DATE
                    219:         case 'R':              // VT_R8
                    220:           V_R8(pvarg) = va_arg(args, double);
                    221:           break;
                    222: 
                    223:         case 'c':              // VT_CY
                    224:          V_CY(pvarg) = va_arg(args, CY);
                    225:          break;
                    226: 
                    227:         case 'b':              // VT_BSTR
                    228:          //REVIEW: do we need to make a copy of this?
                    229:          V_BSTR(pvarg) = va_arg(args, BSTR);
                    230:          break;
                    231: 
                    232:         case 'v':              // VT_VARIANT
                    233:          V_VARIANTREF(pvarg) = va_arg(args, VARIANT FAR*);
                    234:          break;
                    235: 
                    236:        case 'U':               // VT_UNKNOWN
                    237:          vt = VT_DISPATCH;
                    238:          V_UNKNOWN(pvarg) = va_arg(args, IUnknown FAR*);
                    239:          break;
                    240: 
                    241:         case 'D':              // VT_DISPATCH
                    242:          vt = VT_DISPATCH;
                    243:          V_DISPATCH(pvarg) = va_arg(args, IDispatch FAR*);
                    244:          break;
                    245: 
                    246:         default:
                    247:          hresult = ResultFromScode(E_FAIL);
                    248:          goto LFreeRgVarg;
                    249:         }
                    250:       }
                    251: 
                    252:       V_VT(pvarg) = vtMode | vt;
                    253:     }
                    254: 
                    255:     *ppdispparams = pdispparams;
                    256: 
                    257:     return NOERROR;
                    258: 
                    259: 
                    260: LFreeRgVarg:;
                    261:     delete pdispparams->rgvarg;
                    262: 
                    263: LFreeDispParams:;
                    264:     delete pdispparams;
                    265: 
                    266:     return hresult;
                    267: }
                    268: 
                    269: 
                    270: /***
                    271: *PUBLIC HRESULT DispFreeParams(DISPPARAMS*)
                    272: *Purpose:
                    273: *  Free the given DISPPARAMS struct, and its contents.
                    274: *
                    275: *Entry:
                    276: *  pdispparams = the DISPPARAMS structure to free
                    277: *
                    278: *Exit:
                    279: *  return value = HRESULT
                    280: *
                    281: ***********************************************************************/
                    282: STDAPI
                    283: DispFreeParams(DISPPARAMS FAR* pdispparams)
                    284: {
                    285:     UINT i;
                    286:     HRESULT hresult;
                    287: 
                    288:     for(i = 0; i < pdispparams->cArgs; ++i){
                    289:       if ((hresult = VariantClear(&pdispparams->rgvarg[i])) != NOERROR)
                    290:        return hresult;
                    291:     }
                    292: 
                    293:     delete pdispparams->rgvarg;
                    294:     delete pdispparams->rgdispidNamedArgs;
                    295:     delete pdispparams;
                    296: 
                    297:     return NOERROR;
                    298: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.