Annotation of mstools/ole20/samples/spoly/cpoint.cpp, revision 1.1.1.1

1.1       root        1: /*** 
                      2: *cpoint.cpp
                      3: *
                      4: *  Copyright (C) 1992-93, Microsoft Corporation.  All Rights Reserved.
                      5: *
                      6: *Purpose:
                      7: *  This module implements the CPoint and CPointCF classes.
                      8: *
                      9: *  This module is intended as a sample implementation of the IDispatch
                     10: *  interface, and its purpose is to demonstrate how an object can
                     11: *  expose methods and properties for programatic and cross-process
                     12: *  access via the IDispatch interface.
                     13: *
                     14: *Implementation Notes:
                     15: *
                     16: *****************************************************************************/
                     17: 
                     18: #include "spoly.h"
                     19: #include "cpoint.h"
                     20: 
                     21: 
                     22: CPoint::CPoint()
                     23: {
                     24:     m_x = 0;
                     25:     m_y = 0;
                     26:     m_refs = 0;
                     27: }
                     28: 
                     29: /***
                     30: *CPoint::Create(void)
                     31: *Purpose:
                     32: *  Create an instance of a CPoint object.
                     33: *
                     34: *Entry:
                     35: *  None
                     36: *
                     37: *Exit:
                     38: *  returns a CPoint*, NULL if creation failed.
                     39: *
                     40: ***********************************************************************/
                     41: CPoint FAR*
                     42: CPoint::Create()
                     43: {
                     44:     CPoint FAR* ppoint;
                     45: 
                     46:     if((ppoint = new FAR CPoint()) == NULL)
                     47:       return NULL;
                     48:     ppoint->AddRef();
                     49:     return ppoint;
                     50: }
                     51: 
                     52: 
                     53: //---------------------------------------------------------------------
                     54: //                     IUnknown Methods
                     55: //---------------------------------------------------------------------
                     56: 
                     57: 
                     58: STDMETHODIMP
                     59: CPoint::QueryInterface(REFIID riid, void FAR* FAR* ppv)
                     60: {
                     61:     if(riid != IID_IUnknown)
                     62:       if(riid != IID_IDispatch)
                     63:         return ResultFromScode(E_NOINTERFACE);
                     64: 
                     65:     *ppv = this;
                     66:     AddRef();
                     67:     return NOERROR;
                     68: }
                     69: 
                     70: 
                     71: STDMETHODIMP_(unsigned long)
                     72: CPoint::AddRef(void)
                     73: {
                     74:     return ++m_refs;
                     75: }
                     76: 
                     77: 
                     78: STDMETHODIMP_(unsigned long)
                     79: CPoint::Release(void)
                     80: {
                     81:     if(--m_refs == 0){
                     82:       delete this;
                     83:       return 0;
                     84:     }
                     85:     return m_refs;
                     86: }
                     87: 
                     88: 
                     89: //---------------------------------------------------------------------
                     90: //                     IDispatch methods
                     91: //---------------------------------------------------------------------
                     92: 
                     93: /*
                     94:  * NOTE: Support for the following two methods is not available
                     95:  * in this version.
                     96:  *
                     97:  */
                     98: 
                     99: STDMETHODIMP
                    100: CPoint::GetTypeInfoCount(unsigned int FAR* pctinfo)
                    101: {
                    102:     *pctinfo = 0;
                    103:     return NOERROR;
                    104: }
                    105: 
                    106: 
                    107: STDMETHODIMP
                    108: CPoint::GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo)
                    109: {
                    110:     UNUSED(itinfo);
                    111:     UNUSED(lcid);
                    112:     UNUSED(pptinfo);
                    113: 
                    114:     return ResultFromScode(E_NOTIMPL);
                    115: }
                    116: 
                    117: 
                    118: /***
                    119: *HRESULT CPoint::GetIDsOfNames(REFIID, char**, unsigned int, LCID, long*)
                    120: *Purpose:
                    121: *  This method translates the given array of names to a corresponding
                    122: *  array of DISPIDs.
                    123: *
                    124: *  Index 0 of the name array is the member name, and indices 1-N if
                    125: *  present represent named parameters on that member.
                    126: *
                    127: *  The local ID ('lcid') is unused by this naive implementation. A more
                    128: *  sophisticated implementation, sensitive to localization and natural
                    129: *  language support would use the locale ID to interpret the given names
                    130: *  in a correct locale specific context.
                    131: *
                    132: *Entry:
                    133: *  rgszNames = pointer to an array of names
                    134: *  cNames = the number of names in the rgszNames array
                    135: *  lcid = the callers locale ID
                    136: *
                    137: *Exit:
                    138: *  return value = HRESULT
                    139: *  rgid = array of name IDs corresponding to the rgszNames array
                    140: *    this array will contain -1 for each entry that is not known.
                    141: *
                    142: ***********************************************************************/
                    143: STDMETHODIMP
                    144: CPoint::GetIDsOfNames(
                    145:     REFIID riid,
                    146:     char FAR* FAR* rgszNames,
                    147:     unsigned int cNames,
                    148:     LCID lcid,
                    149:     DISPID FAR* rgdispid)
                    150: {
                    151: static MEMBERDESC rgmdCPoint[] = {
                    152:     {"GETX",           IDMEMBER_CPOINT_GETX,   NULL,   0},
                    153:     {"SETX",           IDMEMBER_CPOINT_SETX,   NULL,   0},
                    154:     {"GETY",           IDMEMBER_CPOINT_GETY,   NULL,   0},
                    155:     {"SETY",           IDMEMBER_CPOINT_SETY,   NULL,   0}
                    156: };
                    157: 
                    158:     // this object only exposed the "default" interface.
                    159:     //
                    160:     if(riid != IID_NULL)
                    161:       return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
                    162: 
                    163:     return SPolyGetIDsOfNames(
                    164:       rgmdCPoint, DIM(rgmdCPoint), rgszNames, cNames, lcid, rgdispid);
                    165: }
                    166: 
                    167: 
                    168: /***
                    169: *HRESULT CPoint::Invoke(...)
                    170: *Purpose:
                    171: *  Dispatch a method or property request for objects of type CPoint.
                    172: *
                    173: *  see the IDispatch document for more information, and a general
                    174: *  description of this method.
                    175: *
                    176: *Entry:
                    177: *  dispidMember = the DISPID of the member being requested
                    178: *
                    179: *  riid = reference to the interface ID of the interface on this object
                    180: *    that the requested member belongs to. IID_NULL means to interpret
                    181: *    the member as belonging to the implementation defined "default"
                    182: *    or "primary" interface.
                    183: *
                    184: *  lcid = the caller's locale ID
                    185: *
                    186: *  wFlags = flags indicating the type of access being requested
                    187: *
                    188: *  pdispparams = pointer to the DISPPARAMS struct containing the
                    189: *    requested members arguments (if any) and its named parameter
                    190: *    DISPIDs (if any).
                    191: *
                    192: *Exit:
                    193: *  return value = HRESULT
                    194: *   see the IDispatch spec for a description of possible success codes.
                    195: *
                    196: *  pvarResult = pointer to a caller allocated VARIANT containing
                    197: *    the members return value (if any).
                    198: *
                    199: *  pexcepinfo = caller allocated exception info structure, this will
                    200: *    be filled in only if an exception was raised that must be passed
                    201: *    up through Invoke to an enclosing handler.
                    202: *
                    203: *  puArgErr = pointer to a caller allocated UINT, that will contain the
                    204: *    index of the offending argument if a DISP_E_TYPEMISMATCH error
                    205: *    was returned indicating that one of the arguments was of an
                    206: *    incorrect type and/or could not be reasonably coerced to a proper
                    207: *    type.
                    208: *
                    209: ***********************************************************************/
                    210: STDMETHODIMP
                    211: CPoint::Invoke(
                    212:     DISPID dispidMember,
                    213:     REFIID riid,
                    214:     LCID lcid,
                    215:     unsigned short wFlags,
                    216:     DISPPARAMS FAR* pdispparams,
                    217:     VARIANT FAR* pvarResult,
                    218:     EXCEPINFO FAR* pexcepinfo,
                    219:     unsigned int FAR* puArgErr)
                    220: {
                    221:     unsigned int uArgErr;
                    222:     HRESULT hresult;
                    223:     VARIANTARG varg0;
                    224:     VARIANT varResultDummy;
                    225: 
                    226:     UNUSED(lcid);
                    227:     UNUSED(pexcepinfo);
                    228: 
                    229:     // make sure the wFlags are legal
                    230:     if(wFlags & ~(DISPATCH_METHOD | DISPATCH_PROPERTYGET | DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF))
                    231:       return ResultFromScode(E_INVALIDARG);
                    232: 
                    233:     // this object only exposes a "default" interface.
                    234:     //
                    235:     if(riid != IID_NULL)
                    236:       return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
                    237: 
                    238:     // this makes the following code a bit simpler
                    239:     if(puArgErr == NULL)
                    240:       puArgErr = &uArgErr;
                    241:     if(pvarResult == NULL)
                    242:       pvarResult = &varResultDummy;
                    243: 
                    244:     VariantInit(&varg0);
                    245: 
                    246:     // assume the return type is void, unless we find otherwise.
                    247:     VariantInit(pvarResult);
                    248: 
                    249:     switch(dispidMember){
                    250:     case IDMEMBER_CPOINT_GETX:
                    251:       V_VT(pvarResult) = VT_I2;
                    252:       V_I2(pvarResult) = GetX();
                    253:       break;
                    254: 
                    255:     case IDMEMBER_CPOINT_SETX:
                    256:       hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
                    257:       if(hresult != NOERROR)
                    258:         return hresult;
                    259:       SetX(V_I2(&varg0));
                    260:       break;
                    261: 
                    262:     case IDMEMBER_CPOINT_GETY:
                    263:       V_VT(pvarResult) = VT_I2;
                    264:       V_I2(pvarResult) = GetY();
                    265:       break;
                    266: 
                    267:     case IDMEMBER_CPOINT_SETY:
                    268:       hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
                    269:       if(hresult != NOERROR)
                    270:         return hresult;
                    271:       SetY(V_I2(&varg0));
                    272:       break;
                    273: 
                    274:     default:
                    275:       return ResultFromScode(DISP_E_MEMBERNOTFOUND);
                    276:     }
                    277:     return NOERROR;
                    278: }
                    279: 
                    280: short PASCAL
                    281: CPoint::GetX()
                    282: {
                    283:     return m_x;
                    284: }
                    285: 
                    286: void PASCAL
                    287: CPoint::SetX(short x)
                    288: {
                    289:     m_x = x;
                    290: }
                    291: 
                    292: short PASCAL
                    293: CPoint::GetY()
                    294: {
                    295:     return m_y;
                    296: }
                    297: 
                    298: void PASCAL
                    299: CPoint::SetY(short y)
                    300: {
                    301:     m_y = y;
                    302: }
                    303: 
                    304: 
                    305: //---------------------------------------------------------------------
                    306: //         Implementation of the CPoint Class Factory
                    307: //---------------------------------------------------------------------
                    308: 
                    309: CPointCF::CPointCF()
                    310: {
                    311:     m_refs = 0;
                    312: }
                    313: 
                    314: IClassFactory FAR*
                    315: CPointCF::Create()
                    316: {
                    317:     CPointCF FAR* pCF;
                    318: 
                    319:     if((pCF = new FAR CPointCF()) == NULL)
                    320:       return NULL;
                    321:     pCF->AddRef();
                    322:     return pCF;
                    323: }
                    324: 
                    325: STDMETHODIMP
                    326: CPointCF::QueryInterface(REFIID riid, void FAR* FAR* ppv) 
                    327: {
                    328:     if(riid != IID_IUnknown)
                    329:       if(riid != IID_IClassFactory)
                    330:         return ResultFromScode(E_NOINTERFACE);
                    331:        
                    332:     *ppv = this;
                    333:     ++m_refs;
                    334:     return NOERROR;
                    335: }
                    336: 
                    337: STDMETHODIMP_(unsigned long)
                    338: CPointCF::AddRef(void)
                    339: {
                    340:     return ++m_refs;
                    341: }
                    342: 
                    343: STDMETHODIMP_(unsigned long)
                    344: CPointCF::Release(void)
                    345: {
                    346:     if(--m_refs == 0){
                    347:       delete this;
                    348:       return 0;
                    349:     }
                    350:     return m_refs;
                    351: }
                    352: 
                    353: STDMETHODIMP
                    354: CPointCF::CreateInstance(
                    355:     IUnknown FAR* punkOuter,
                    356:     REFIID riid,
                    357:     void FAR* FAR* ppv)
                    358: {
                    359:     HRESULT hresult;
                    360:     CPoint FAR *ppoint;
                    361: 
                    362:     UNUSED(punkOuter);
                    363: 
                    364:     if((ppoint = CPoint::Create()) == NULL){
                    365:       *ppv = NULL;
                    366:       return ResultFromScode(E_OUTOFMEMORY);
                    367:     }
                    368:     hresult = ppoint->QueryInterface(riid, ppv);
                    369:     ppoint->Release();
                    370:     return hresult;
                    371: }
                    372: 
                    373: STDMETHODIMP
                    374: #ifdef _MAC
                    375: CPointCF::LockServer(unsigned long fLock)
                    376: #else
                    377: CPointCF::LockServer(BOOL fLock)
                    378: #endif
                    379: {
                    380:     UNUSED(fLock);
                    381: 
                    382:     return NOERROR;
                    383: }
                    384: 

unix.superglobalmegacorp.com

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