|
|
1.1 ! root 1: /*** ! 2: *crempoly.cpp ! 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 the implementation of CRemPoly, the remote polygon ! 9: * class. This class presents a standard C++ vtable interface to the ! 10: * rest of the application, and hides the details of talking to the ! 11: * actual remote CPoly class exposed by the SPoly server. Each of ! 12: * the introduced methods is simply a cover for an IDispatch invocation ! 13: * of the actual method on the remote object. ! 14: * ! 15: *Implementation Notes: ! 16: * ! 17: *****************************************************************************/ ! 18: ! 19: #include "dispdemo.h" ! 20: #include "crempoly.h" ! 21: ! 22: extern int g_fTrace; ! 23: ! 24: // method names on the CPoly class. ! 25: // ! 26: char FAR* CRemPoly::m_rgszMethods[] = { ! 27: "draw", ! 28: "dump", ! 29: "reset", ! 30: "addpoint", ! 31: "enumpoints", ! 32: "getxorigin", ! 33: "setxorigin", ! 34: "getyorigin", ! 35: "setyorigin", ! 36: "getwidth", ! 37: "setwidth", ! 38: "get_red", ! 39: "set_red", ! 40: "get_green", ! 41: "set_green", ! 42: "get_blue", ! 43: "set_blue" ! 44: }; ! 45: ! 46: #ifdef _MAC ! 47: # define IfMac(X) (X) ! 48: # define IfWin(X) ! 49: #else ! 50: # define IfMac(X) ! 51: # define IfWin(X) (X) ! 52: #endif ! 53: ! 54: ! 55: CRemPoly::CRemPoly() ! 56: { ! 57: m_refs = 0; ! 58: m_pdisp = (IDispatch FAR*)NULL; ! 59: } ! 60: ! 61: ! 62: // A useful pre-initialized DISPATCHPARAMS, used on all the methods that ! 63: // take 0 arguments. ! 64: // ! 65: DISPPARAMS NEAR g_dispparamsNoArgs = {NULL, NULL, 0, 0}; ! 66: ! 67: ! 68: /*** ! 69: *HRESULT CRemPoly::Create(clsid, CRemPoly**) ! 70: * ! 71: *Purpose: ! 72: * This function creates an instance of the CRemPoly class, connects ! 73: * it to the IDispatch interface of the remote CPoly class, and learns ! 74: * the DISPIDs for the members (that we know about) exposed by that ! 75: * class. ! 76: * ! 77: *Entry: ! 78: * clsid = The CLSID of the CPoly we are to create. (taking this as a ! 79: * param is a bit weird, but allows us to connect to several remote ! 80: * versions. ! 81: * ! 82: *Exit: ! 83: * return value = HRESULT ! 84: * ! 85: * *pprempoly = pointer to the newly created CRemPoly, if successfyl. ! 86: * ! 87: ***********************************************************************/ ! 88: HRESULT ! 89: CRemPoly::Create(CLSID clsid, CRemPoly FAR* FAR* pprempoly) ! 90: { ! 91: int i; ! 92: HRESULT hresult; ! 93: IUnknown FAR* punk; ! 94: CRemPoly FAR* prempoly; ! 95: ! 96: ! 97: prempoly = new FAR CRemPoly(); ! 98: if(prempoly == (CRemPoly FAR*)NULL){ ! 99: hresult = ResultFromScode(E_OUTOFMEMORY); ! 100: goto LError; ! 101: } ! 102: prempoly->AddRef(); ! 103: ! 104: // create an instance of the remote CPoly class. ! 105: // ! 106: IfMac(DbPrintf("CoCreateInstance(CLSID_CPoly)")); ! 107: hresult = CoCreateInstance( ! 108: clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void FAR* FAR*)&punk); ! 109: if(hresult != NOERROR){ ! 110: IfMac(DbPrintf("CoCreateInstance() = 0x%x", hresult)); ! 111: IfWin(MessageBox(NULL, "Unable to create polygon object", NULL, MB_OK)); ! 112: goto LFreeCRemPoly; ! 113: } ! 114: ! 115: // were going to talk to this remote instance via IDispatch. ! 116: // ! 117: IfMac(DbPrintf("QueryInterface(IID_IDispatch)")); ! 118: hresult = punk->QueryInterface( ! 119: IID_IDispatch, (void FAR* FAR*)&prempoly->m_pdisp); ! 120: if(hresult != NOERROR){ ! 121: IfMac(DbPrintf("QueryInterface(IID_IDispatch) = 0x%x", hresult)); ! 122: IfWin(MessageBox(NULL, "Unable to QueryInterface to IDispatch", NULL, MB_OK)); ! 123: goto LReleaseUnk; ! 124: } ! 125: ! 126: // We learn *all* the member IDs up front. A more sophisticated ! 127: // implementation might defer learning about the IDs for a given ! 128: // method until the first time the method is invoked, thereby ! 129: // amortizing the creation costs. ! 130: // ! 131: IfMac(DbPrintf("GetIDsOfNames()")); ! 132: for(i = 0; i < IMETH_CREMPOLY_MAX; ++i){ ! 133: hresult = prempoly->m_pdisp->GetIDsOfNames( ! 134: IID_NULL, ! 135: &prempoly->m_rgszMethods[i], ! 136: 1, LOCALE_USER_DEFAULT, ! 137: &prempoly->m_rgdispid[i]); ! 138: if(hresult != NOERROR){ ! 139: IfMac(DbPrintf("GetIDsOfNames() = 0x%x", hresult)); ! 140: IfWin(MessageBox(NULL, "Unrecognized member name", NULL, MB_OK)); ! 141: goto LReleaseUnk; ! 142: } ! 143: } ! 144: ! 145: punk->Release(); ! 146: ! 147: *pprempoly = prempoly; ! 148: ! 149: IfMac(DbPrintf("Object created.")); ! 150: ! 151: return NOERROR; ! 152: ! 153: LReleaseUnk:; ! 154: punk->Release(); ! 155: ! 156: LFreeCRemPoly:; ! 157: prempoly->Release(); ! 158: ! 159: LError:; ! 160: return hresult; ! 161: } ! 162: ! 163: ! 164: //--------------------------------------------------------------------- ! 165: // IUnknown methods ! 166: //--------------------------------------------------------------------- ! 167: ! 168: ! 169: /*** ! 170: *HRESULT CRemPoly::QueryInterface(REFIID, void**) ! 171: * ! 172: *Purpose: ! 173: * Standard Ole2 implementation of QueryInterface. This class ! 174: * supports the IUnknown interface, and introduces a number of ! 175: * nonvirtual members. ! 176: * ! 177: *Entry: ! 178: * riid = reference to the requested interface id ! 179: * ! 180: *Exit: ! 181: * return value = HRESULT ! 182: * *ppv = pointer to the requested interface, if successful. ! 183: * ! 184: ***********************************************************************/ ! 185: STDMETHODIMP ! 186: CRemPoly::QueryInterface(REFIID riid, void FAR* FAR* ppv) ! 187: { ! 188: if(riid == IID_IUnknown){ ! 189: *ppv = this; ! 190: AddRef(); ! 191: return NOERROR; ! 192: } ! 193: return ResultFromScode(E_NOINTERFACE); ! 194: } ! 195: ! 196: ! 197: /*** ! 198: *unsigned long CRemPoly::AddRef(void) ! 199: * ! 200: *Purpose: ! 201: * Add a reference to the instance. ! 202: * ! 203: *Entry: ! 204: * None ! 205: * ! 206: *Exit: ! 207: * return value = unsigned long. The resulting reference count. ! 208: * ! 209: ***********************************************************************/ ! 210: STDMETHODIMP_(unsigned long) ! 211: CRemPoly::AddRef(void) ! 212: { ! 213: return ++m_refs; ! 214: } ! 215: ! 216: ! 217: /*** ! 218: *unsigned long CRemPoly::Release(void) ! 219: * ! 220: *Purpose: ! 221: * Release a reference to the instance. If the reference count goes ! 222: * to zero, delete the instance. ! 223: * ! 224: *Entry: ! 225: * None ! 226: * ! 227: *Exit: ! 228: * return value = unsigned long. The resulting reference count. ! 229: * ! 230: ***********************************************************************/ ! 231: STDMETHODIMP_(unsigned long) ! 232: CRemPoly::Release(void) ! 233: { ! 234: if(--m_refs == 0){ ! 235: if(m_pdisp != (IDispatch FAR*)NULL){ ! 236: m_pdisp->Release(); ! 237: } ! 238: delete this; ! 239: return 0; ! 240: } ! 241: return m_refs; ! 242: } ! 243: ! 244: ! 245: //--------------------------------------------------------------------- ! 246: // Introduced methods ! 247: //--------------------------------------------------------------------- ! 248: ! 249: ! 250: /* ! 251: * Each of these methods is simply a cover for an IDispatch Invocation ! 252: * of the actual method on the remote CPoly class. This allows CRemPoly ! 253: * to present an interface that looks and acts just like the CPoly ! 254: * object, even though the actual work is being done in another process. ! 255: * ! 256: */ ! 257: ! 258: /*** ! 259: *HRESULT CRemPoly::Draw(void) ! 260: * ! 261: *Purpose: ! 262: * Invoke the Draw method on the remote CPoly instance. ! 263: * ! 264: *Entry: ! 265: * None ! 266: * ! 267: *Exit: ! 268: * return value = HRESULT ! 269: * ! 270: ***********************************************************************/ ! 271: HRESULT ! 272: CRemPoly::Draw() ! 273: { ! 274: return m_pdisp->Invoke( ! 275: m_rgdispid[IMETH_CREMPOLY_DRAW], ! 276: IID_NULL, ! 277: LOCALE_USER_DEFAULT, ! 278: DISPATCH_METHOD, ! 279: &g_dispparamsNoArgs, NULL, NULL, NULL); ! 280: } ! 281: ! 282: ! 283: /*** ! 284: *HRESULT CRemPoly::Dump(void) ! 285: * ! 286: *Purpose: ! 287: * Invoke the Dump() method on the remote CPoly instance. This method ! 288: * dumps the contained CPoints and writes the properties of the remote ! 289: * CPoly instance to the debug window. ! 290: * ! 291: *Entry: ! 292: * None ! 293: * ! 294: *Exit: ! 295: * return value = HRESULT ! 296: * ! 297: ***********************************************************************/ ! 298: HRESULT ! 299: CRemPoly::Dump() ! 300: { ! 301: return m_pdisp->Invoke( ! 302: m_rgdispid[IMETH_CREMPOLY_DUMP], ! 303: IID_NULL, ! 304: LOCALE_USER_DEFAULT, ! 305: DISPATCH_METHOD, ! 306: &g_dispparamsNoArgs, NULL, NULL, NULL); ! 307: } ! 308: ! 309: ! 310: /*** ! 311: *HRESULT CRemPoly::Reset(void) ! 312: * ! 313: *Purpose: ! 314: * Invoke the Reset() method on the remote CPoly instance. The Reset() ! 315: * method causes the remote CPoly to release all contained CPoints. ! 316: * ! 317: *Entry: ! 318: * None ! 319: * ! 320: *Exit: ! 321: * return value = HRESULT ! 322: * ! 323: ***********************************************************************/ ! 324: HRESULT ! 325: CRemPoly::Reset() ! 326: { ! 327: return m_pdisp->Invoke( ! 328: m_rgdispid[IMETH_CREMPOLY_RESET], ! 329: IID_NULL, ! 330: LOCALE_USER_DEFAULT, ! 331: DISPATCH_METHOD, ! 332: &g_dispparamsNoArgs, NULL, NULL, NULL); ! 333: } ! 334: ! 335: ! 336: /*** ! 337: *HRESULT CRemPoly::AddPoint(short, short) ! 338: * ! 339: *Purpose: ! 340: * Invoke the AddPoint method in the remote CPoly object to add a ! 341: * new point with the given coordinates to this instance. ! 342: * ! 343: *Entry: ! 344: * x,y = the x and y coordinates of the new point. ! 345: * ! 346: *Exit: ! 347: * return value = HRESULT ! 348: * ! 349: ***********************************************************************/ ! 350: HRESULT ! 351: CRemPoly::AddPoint(short x, short y) ! 352: { ! 353: HRESULT hresult; ! 354: VARIANTARG varg[2]; ! 355: DISPPARAMS dispparams; ! 356: ! 357: V_VT(&varg[0]) = VT_I2; ! 358: V_I2(&varg[0]) = y; ! 359: ! 360: V_VT(&varg[1]) = VT_I2; ! 361: V_I2(&varg[1]) = x; ! 362: ! 363: dispparams.cArgs = 2; ! 364: dispparams.rgvarg = varg; ! 365: dispparams.cNamedArgs = 0; ! 366: dispparams.rgdispidNamedArgs = NULL; ! 367: ! 368: hresult = m_pdisp->Invoke( ! 369: m_rgdispid[IMETH_CREMPOLY_ADDPOINT], ! 370: IID_NULL, ! 371: LOCALE_USER_DEFAULT, ! 372: DISPATCH_METHOD, ! 373: &dispparams, NULL, NULL, NULL); ! 374: ! 375: return hresult; ! 376: } ! 377: ! 378: ! 379: /*** ! 380: *HRESULT CRemPoly::EnumPoints(IEnumVARIANT**) ! 381: *Purpose: ! 382: * Inoke the EnumPoints() method in the remote object to ! 383: * get a enumerator for the points contained in the current poly. ! 384: * ! 385: *Entry: ! 386: * None ! 387: * ! 388: *Exit: ! 389: * return value = HRESULT ! 390: * ! 391: * *ppenum = pointer to the point enumerator ! 392: * ! 393: ***********************************************************************/ ! 394: HRESULT ! 395: CRemPoly::EnumPoints(IEnumVARIANT FAR* FAR* ppenum) ! 396: { ! 397: HRESULT hresult; ! 398: IEnumVARIANT FAR* penum; ! 399: VARIANT varResult, FAR* pvarResult; ! 400: ! 401: ! 402: pvarResult = &varResult; ! 403: VariantInit(pvarResult); ! 404: hresult = m_pdisp->Invoke( ! 405: m_rgdispid[IMETH_CREMPOLY_ENUMPOINTS], ! 406: IID_NULL, ! 407: LOCALE_USER_DEFAULT, ! 408: DISPATCH_METHOD, ! 409: &g_dispparamsNoArgs, pvarResult, NULL, NULL); ! 410: ! 411: if(hresult != NOERROR) ! 412: return hresult; ! 413: ! 414: if(V_VT(pvarResult) != VT_UNKNOWN) ! 415: return ResultFromScode(E_FAIL); ! 416: ! 417: hresult = V_UNKNOWN(pvarResult)->QueryInterface( ! 418: IID_IEnumVARIANT, (void FAR* FAR*)&penum); ! 419: ! 420: if(hresult == NOERROR) ! 421: *ppenum = penum; ! 422: ! 423: VariantClear(pvarResult); ! 424: ! 425: return NOERROR; ! 426: } ! 427: ! 428: ! 429: /*** ! 430: *HRESULT CRemPoly::GetXOrigin(short*) ! 431: * ! 432: *Purpose: ! 433: * Invoke the GetXOrigin() method on the remote object to extract ! 434: * the current value of the XOrigin property. ! 435: * ! 436: *Entry: ! 437: * None ! 438: * ! 439: *Exit: ! 440: * return value = HRESULT ! 441: * ! 442: * *pxorg = the current X origin of the polygon. ! 443: * ! 444: ***********************************************************************/ ! 445: HRESULT ! 446: CRemPoly::GetXOrigin(short FAR* pxorg) ! 447: { ! 448: HRESULT hresult; ! 449: VARIANT varResult; ! 450: ! 451: VariantInit(&varResult); ! 452: hresult = m_pdisp->Invoke( ! 453: m_rgdispid[IMETH_CREMPOLY_GETXORIGIN], ! 454: IID_NULL, ! 455: LOCALE_USER_DEFAULT, ! 456: DISPATCH_METHOD, ! 457: &g_dispparamsNoArgs, &varResult, NULL, NULL); ! 458: ! 459: if(hresult != NOERROR) ! 460: return hresult; ! 461: ! 462: *pxorg = V_I2(&varResult); ! 463: ! 464: return NOERROR; ! 465: } ! 466: ! 467: ! 468: /*** ! 469: *HRESULT CRemPoly::SetXOrigin(short) ! 470: * ! 471: *Purpose: ! 472: * Invoke the SetXOrigin method on the remote object to set the ! 473: * XOrigin property of the polygon to the given value. ! 474: * ! 475: *Entry: ! 476: * xorg = the new X origin ! 477: * ! 478: *Exit: ! 479: * return value = HRESULT ! 480: * ! 481: ***********************************************************************/ ! 482: HRESULT ! 483: CRemPoly::SetXOrigin(short xorg) ! 484: { ! 485: VARIANTARG varg; ! 486: DISPPARAMS dispparams; ! 487: ! 488: ! 489: V_VT(&varg) = VT_I2; ! 490: V_I2(&varg) = xorg; ! 491: ! 492: dispparams.cArgs = 1; ! 493: dispparams.cNamedArgs = 0; ! 494: dispparams.rgvarg = &varg; ! 495: ! 496: return m_pdisp->Invoke( ! 497: m_rgdispid[IMETH_CREMPOLY_SETXORIGIN], ! 498: IID_NULL, ! 499: LOCALE_USER_DEFAULT, ! 500: DISPATCH_METHOD, ! 501: &dispparams, NULL, NULL, NULL); ! 502: } ! 503: ! 504: ! 505: /*** ! 506: *HRESULT CRemPoly::GetYOrigin(short*) ! 507: * ! 508: *Purpose: ! 509: * Invoke the GetYOrigin() method on the remote object to extract ! 510: * the current value of the YOrigin property. ! 511: * ! 512: *Entry: ! 513: * None ! 514: * ! 515: *Exit: ! 516: * return value = HRESULT ! 517: * ! 518: * *pyorg = the current Y origin of the polygon ! 519: * ! 520: ***********************************************************************/ ! 521: HRESULT ! 522: CRemPoly::GetYOrigin(short FAR* pyorg) ! 523: { ! 524: HRESULT hresult; ! 525: VARIANT varResult; ! 526: ! 527: ! 528: VariantInit(&varResult); ! 529: hresult = m_pdisp->Invoke( ! 530: m_rgdispid[IMETH_CREMPOLY_GETYORIGIN], ! 531: IID_NULL, ! 532: LOCALE_USER_DEFAULT, ! 533: DISPATCH_METHOD, ! 534: &g_dispparamsNoArgs, &varResult, NULL, NULL); ! 535: ! 536: if(hresult != NOERROR) ! 537: return hresult; ! 538: ! 539: *pyorg = V_I2(&varResult); ! 540: ! 541: return hresult; ! 542: } ! 543: ! 544: ! 545: /*** ! 546: *HRESULT CRemPoly::SetYOrigin(short) ! 547: * ! 548: *Purpose: ! 549: * Invoke the SetYOrigin method on the remote object to set the ! 550: * YOrigin property of the polygon to the given value. ! 551: * ! 552: *Entry: ! 553: * yorg = the new Y origin ! 554: * ! 555: *Exit: ! 556: * return value = HRESULT ! 557: * ! 558: ***********************************************************************/ ! 559: HRESULT ! 560: CRemPoly::SetYOrigin(short yorg) ! 561: { ! 562: VARIANTARG varg; ! 563: DISPPARAMS dispparams; ! 564: ! 565: V_VT(&varg) = VT_I2; ! 566: V_I2(&varg) = yorg; ! 567: ! 568: dispparams.cArgs = 1; ! 569: dispparams.cNamedArgs = 0; ! 570: dispparams.rgvarg = &varg; ! 571: ! 572: return m_pdisp->Invoke( ! 573: m_rgdispid[IMETH_CREMPOLY_SETYORIGIN], ! 574: IID_NULL, ! 575: LOCALE_USER_DEFAULT, ! 576: DISPATCH_METHOD, ! 577: &dispparams, NULL, NULL, NULL); ! 578: } ! 579: ! 580: ! 581: /*** ! 582: *HRESULT CRemPoly::GetWidth(short*) ! 583: * ! 584: *Purpose: ! 585: * Invoke the GetWidth() method on the remote object to extract ! 586: * the current value of the line width property. ! 587: * ! 588: *Entry: ! 589: * None ! 590: * ! 591: *Exit: ! 592: * return value = HRESULT ! 593: * ! 594: * *pwidth = short, the current line width of the polygon ! 595: * ! 596: ***********************************************************************/ ! 597: HRESULT ! 598: CRemPoly::GetWidth(short FAR* pwidth) ! 599: { ! 600: HRESULT hresult; ! 601: VARIANT varResult; ! 602: ! 603: ! 604: hresult = m_pdisp->Invoke( ! 605: m_rgdispid[IMETH_CREMPOLY_GETWIDTH], ! 606: IID_NULL, ! 607: LOCALE_USER_DEFAULT, ! 608: DISPATCH_METHOD, ! 609: &g_dispparamsNoArgs, &varResult, NULL, NULL); ! 610: ! 611: if(hresult != NOERROR) ! 612: return hresult; ! 613: ! 614: *pwidth = V_I2(&varResult); ! 615: ! 616: return NOERROR; ! 617: } ! 618: ! 619: ! 620: /*** ! 621: *HRESULT CRemPoly::SetWidth(short) ! 622: * ! 623: *Purpose: ! 624: * Invoke the SetWidth method on the remote object to set the ! 625: * line width property of the polygon to the given value. ! 626: * ! 627: *Entry: ! 628: * width = the new value for the line width property. ! 629: * ! 630: *Exit: ! 631: * return value = HRESULT ! 632: * ! 633: ***********************************************************************/ ! 634: HRESULT ! 635: CRemPoly::SetWidth(short width) ! 636: { ! 637: VARIANTARG varg; ! 638: DISPPARAMS dispparams; ! 639: ! 640: ! 641: V_VT(&varg) = VT_I2; ! 642: V_I2(&varg) = width; ! 643: ! 644: dispparams.cArgs = 1; ! 645: dispparams.cNamedArgs = 0; ! 646: dispparams.rgvarg = &varg; ! 647: ! 648: return m_pdisp->Invoke( ! 649: m_rgdispid[IMETH_CREMPOLY_SETWIDTH], ! 650: IID_NULL, ! 651: LOCALE_USER_DEFAULT, ! 652: DISPATCH_METHOD, ! 653: &dispparams, NULL, NULL, NULL); ! 654: } ! 655: ! 656: ! 657: HRESULT CRemPoly::get_red(short FAR* psRed) ! 658: { ! 659: return get_i2(m_rgdispid[IMETH_CREMPOLY_GETRED], psRed); ! 660: } ! 661: ! 662: HRESULT CRemPoly::set_red(short sRed) ! 663: { ! 664: return set_i2(m_rgdispid[IMETH_CREMPOLY_SETRED], sRed); ! 665: } ! 666: ! 667: ! 668: HRESULT CRemPoly::get_green(short FAR* psGreen) ! 669: { ! 670: return get_i2(m_rgdispid[IMETH_CREMPOLY_GETGREEN], psGreen); ! 671: } ! 672: ! 673: HRESULT CRemPoly::set_green(short sGreen) ! 674: { ! 675: return set_i2(m_rgdispid[IMETH_CREMPOLY_SETGREEN], sGreen); ! 676: } ! 677: ! 678: ! 679: HRESULT CRemPoly::get_blue(short FAR* psBlue) ! 680: { ! 681: return get_i2(m_rgdispid[IMETH_CREMPOLY_GETBLUE], psBlue); ! 682: } ! 683: ! 684: HRESULT CRemPoly::set_blue(short sBlue) ! 685: { ! 686: return set_i2(m_rgdispid[IMETH_CREMPOLY_SETBLUE], sBlue); ! 687: } ! 688: ! 689: HRESULT ! 690: CRemPoly::get_i2(DISPID dispid, short FAR* ps) ! 691: { ! 692: HRESULT hresult; ! 693: VARIANT varResult; ! 694: ! 695: VariantInit(&varResult); ! 696: ! 697: hresult = m_pdisp->Invoke( ! 698: dispid, ! 699: IID_NULL, ! 700: LOCALE_SYSTEM_DEFAULT, ! 701: DISPATCH_METHOD, ! 702: &g_dispparamsNoArgs, ! 703: &varResult, NULL, NULL); ! 704: ! 705: if(hresult != NOERROR) ! 706: return hresult; ! 707: ! 708: hresult = VariantChangeType(&varResult, &varResult, 0, VT_I2); ! 709: if(hresult != NOERROR){ ! 710: VariantClear(&varResult); ! 711: return hresult; ! 712: } ! 713: ! 714: *ps = V_I2(&varResult); ! 715: return NOERROR; ! 716: } ! 717: ! 718: HRESULT ! 719: CRemPoly::set_i2(DISPID dispid, short s) ! 720: { ! 721: VARIANTARG varg; ! 722: DISPPARAMS dispparams; ! 723: ! 724: V_VT(&varg) = VT_I2; ! 725: V_I2(&varg) = s; ! 726: ! 727: dispparams.cArgs = 1; ! 728: dispparams.cNamedArgs = 0; ! 729: dispparams.rgvarg = &varg; ! 730: ! 731: return m_pdisp->Invoke( ! 732: dispid, ! 733: IID_NULL, ! 734: LOCALE_SYSTEM_DEFAULT, ! 735: DISPATCH_METHOD, ! 736: &dispparams, NULL, NULL, NULL); ! 737: } ! 738: ! 739: ! 740: /*** ! 741: *void DoPoly(CLSID) ! 742: * ! 743: *Purpose: ! 744: * This function simply exercises our CRemPoly class by creating an ! 745: * instance and invoking a number of its methods. ! 746: * ! 747: *Entry: ! 748: * None ! 749: * ! 750: *Exit: ! 751: * None ! 752: * ! 753: ***********************************************************************/ ! 754: STDAPI ! 755: DoPoly(CLSID clsid) ! 756: { ! 757: HRESULT hr; ! 758: int numpoly, i, j; ! 759: ! 760: static struct { ! 761: short x; ! 762: short y; ! 763: } rgptPoly[] = { ! 764: { 25, 0} ! 765: , { 75, 0} ! 766: , {100, 25} ! 767: , {100, 75} ! 768: , { 75, 100} ! 769: , { 25, 100} ! 770: , { 0, 75} ! 771: , { 0, 25} ! 772: }; ! 773: ! 774: static struct { ! 775: short red; ! 776: short green; ! 777: short blue; ! 778: } rgrgbColors[] = { ! 779: #ifdef _MAC ! 780: { 0, 0, 0} ! 781: , { 0, 0, 0x7fff} ! 782: , { 0, 0x7fff, 0} ! 783: , {0x7fff, 0, 0} ! 784: , {0x7fff, 0, 0x7fff} ! 785: , {0x7fff, 0x7fff, 0} ! 786: , {0x7fff, 0x7fff, 0x7fff} ! 787: #else ! 788: { 0, 0, 0} ! 789: , { 0, 0, 127} ! 790: , { 0, 127, 0} ! 791: , {127, 0, 0} ! 792: , {127, 0, 127} ! 793: , {127, 127, 0} ! 794: , {127, 127, 127} ! 795: #endif ! 796: }; ! 797: ! 798: CRemPoly FAR* rgprempoly[DIM(rgrgbColors)]; ! 799: ! 800: numpoly = DIM(rgprempoly); ! 801: ! 802: // init ! 803: for(i = 0; i < numpoly; ++i) ! 804: rgprempoly[i] = (CRemPoly FAR*)NULL; ! 805: ! 806: for(i = 0; i < numpoly; ++i){ ! 807: hr = CRemPoly::Create(clsid, &rgprempoly[i]); ! 808: if(hr != NOERROR) ! 809: goto LError0; ! 810: IfMac(DbPrintf("CRemPoly::Create()")); ! 811: ! 812: for(j = 0; j < DIM(rgptPoly); ++j){ ! 813: short x = rgptPoly[j].x; ! 814: short y = rgptPoly[j].y; ! 815: IfMac(DbPrintf("CRemPoly::AddPoint(%d,%d)", x, y)); ! 816: hr = rgprempoly[i]->AddPoint(x, y); ! 817: ASSERT(hr == NOERROR); ! 818: } ! 819: ! 820: for(j = 0; j < DIM(rgrgbColors); ++j){ ! 821: hr = rgprempoly[i]->SetWidth(i + j); ! 822: ASSERT(hr == NOERROR); ! 823: IfMac(DbPrintf("CRemPoly::SetWidth()")); ! 824: ! 825: hr = rgprempoly[i]->set_red(rgrgbColors[j].red); ! 826: ASSERT(hr == NOERROR); ! 827: IfMac(DbPrintf("CRemPoly::set_red()")); ! 828: ! 829: hr = rgprempoly[i]->set_green(rgrgbColors[j].green); ! 830: ASSERT(hr == NOERROR); ! 831: IfMac(DbPrintf("CRemPoly::set_green()")); ! 832: ! 833: hr = rgprempoly[i]->set_blue(rgrgbColors[j].blue); ! 834: ASSERT(hr == NOERROR); ! 835: IfMac(DbPrintf("CRemPoly::set_blue()")); ! 836: ! 837: hr = rgprempoly[i]->SetXOrigin((2*i) + j << 4); ! 838: ASSERT(hr == NOERROR); ! 839: IfMac(DbPrintf("CRemPoly::SetXOrigin()")); ! 840: ! 841: hr = rgprempoly[i]->SetYOrigin(j << 4); ! 842: ASSERT(hr == NOERROR); ! 843: IfMac(DbPrintf("CRemPoly::SetYOrigin()")); ! 844: ! 845: hr = rgprempoly[i]->Draw(); ! 846: ASSERT(hr == NOERROR); ! 847: IfMac(DbPrintf("CRemPoly::Draw()")); ! 848: } ! 849: } ! 850: ! 851: hr = NOERROR; ! 852: ! 853: LError0:; ! 854: for(i = 0; i < numpoly; ++i){ ! 855: if(rgprempoly[i] != (CRemPoly FAR*)NULL){ ! 856: rgprempoly[i]->Release(); ! 857: } ! 858: } ! 859: ! 860: return hr; ! 861: } ! 862:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.