00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00050 #ifndef ATLSTL_INCL_ATLSTL_AUTOMATION_HPP_MULTIPLE_DISPATCH
00051 #define ATLSTL_INCL_ATLSTL_AUTOMATION_HPP_MULTIPLE_DISPATCH
00052
00053 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00054 # define ATLSTL_VER_ATLSTL_AUTOMATION_HPP_MULTIPLE_DISPATCH_MAJOR 2
00055 # define ATLSTL_VER_ATLSTL_AUTOMATION_HPP_MULTIPLE_DISPATCH_MINOR 1
00056 # define ATLSTL_VER_ATLSTL_AUTOMATION_HPP_MULTIPLE_DISPATCH_REVISION 2
00057 # define ATLSTL_VER_ATLSTL_AUTOMATION_HPP_MULTIPLE_DISPATCH_EDIT 16
00058 #endif
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 #ifndef ATLSTL_INCL_ATLSTL_HPP_ATLSTL
00074 # include <atlstl/atlstl.hpp>
00075 #endif
00076
00077
00078
00079
00080
00081 #ifndef _ATLSTL_NO_NAMESPACE
00082 # if defined(_STLSOFT_NO_NAMESPACE) || \
00083 defined(STLSOFT_DOCUMENTATION_SKIP_SECTION)
00084
00085 namespace atlstl
00086 {
00087 # else
00088
00089
00090 namespace stlsoft
00091 {
00092
00093 namespace atlstl_project
00094 {
00095
00096 # endif
00097 #endif
00098
00099
00100
00101
00102
00184
00185 template< ss_typename_param_k I0
00186 , IID const *IID0
00187 , ss_typename_param_k I1
00188 , IID const *IID1
00189 , GUID const *LibID
00190 >
00191 class IDispatchImpl2
00192 : public IDispatchImpl<I0, IID0, LibID>
00193 , public IDispatchImpl<I1, IID1, LibID>
00194 {
00197 public:
00198 typedef IDispatchImpl<I0, IID0, LibID> dispatch_parent_0_type;
00199 typedef IDispatchImpl<I1, IID1, LibID> dispatch_parent_1_type;
00200
00201
00204 protected:
00225 STDMETHOD(GetIDsOfNames)( REFIID riid
00226 , LPOLESTR *rgszNames
00227 , UINT cNames
00228 , LCID lcid
00229 , DISPID *rgdispid)
00230 {
00231 unsigned index = 1;
00232 HRESULT hr = dispatch_parent_0_type::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
00233
00234 if( FAILED(hr) &&
00235 DISP_E_UNKNOWNNAME == hr)
00236 {
00237 ++index;
00238
00239 hr = dispatch_parent_1_type::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
00240 }
00241
00242
00243 if(SUCCEEDED(hr))
00244 {
00245 DISPID dispidFlag = DISPID(0x1) << (8 * sizeof(DISPID) - 2);
00246
00247 dispidFlag >>= (index - 1);
00248
00249 for(UINT i = 0; i < cNames; ++i)
00250 {
00251 if(rgdispid[i] < 0)
00252 {
00253
00254
00255
00256 }
00257 else
00258 {
00259 ATLSTL_MESSAGE_ASSERT("Dispatch Id is out of range!", 0 == (dispidFlag & rgdispid[i]));
00260
00261 rgdispid[i] |= dispidFlag;
00262 }
00263 }
00264 }
00265
00266 return hr;
00267 }
00283 STDMETHOD(Invoke)( DISPID dispidMember
00284 , REFIID riid
00285 , LCID lcid
00286 , WORD wFlags
00287 , DISPPARAMS *pdispparams
00288 , VARIANT *pvarResult
00289 , EXCEPINFO *pexcepinfo
00290 , UINT *puArgErr)
00291 {
00292 if(dispidMember >= 0)
00293 {
00294 DISPID dispidFlag = DISPID(0x1) << (8 * sizeof(DISPID) - 2);
00295
00296 dispidFlag >>= 0;
00297 if(dispidMember & dispidFlag)
00298 {
00299 return dispatch_parent_0_type::Invoke(dispidMember & ~dispidFlag, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00300 }
00301
00302 dispidFlag >>= 1;
00303 if(dispidMember & dispidFlag)
00304 {
00305 return dispatch_parent_1_type::Invoke(dispidMember & ~dispidFlag, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00306 }
00307 }
00308
00309 HRESULT hr = dispatch_parent_0_type::Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00310
00311 if( FAILED(hr) &&
00312 DISP_E_MEMBERNOTFOUND == hr)
00313 {
00314 hr = dispatch_parent_1_type::Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00315 }
00316
00317 return hr;
00318 }
00320 };
00321
00331
00332 template< ss_typename_param_k I0
00333 , IID const *IID0
00334 , ss_typename_param_k I1
00335 , IID const *IID1
00336 , ss_typename_param_k I2
00337 , IID const *IID2
00338 , GUID const *LibID
00339 >
00340 class IDispatchImpl3
00341 : public IDispatchImpl<I0, IID0, LibID>
00342 , public IDispatchImpl<I1, IID1, LibID>
00343 , public IDispatchImpl<I2, IID2, LibID>
00344 {
00347 public:
00348 typedef IDispatchImpl<I0, IID0, LibID> dispatch_parent_0_type;
00349 typedef IDispatchImpl<I1, IID1, LibID> dispatch_parent_1_type;
00350 typedef IDispatchImpl<I2, IID2, LibID> dispatch_parent_2_type;
00351
00352
00355 protected:
00376 STDMETHOD(GetIDsOfNames)( REFIID riid
00377 , LPOLESTR *rgszNames
00378 , UINT cNames
00379 , LCID lcid
00380 , DISPID *rgdispid)
00381 {
00382 unsigned index = 1;
00383 HRESULT hr = dispatch_parent_0_type::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
00384
00385 if( FAILED(hr) &&
00386 DISP_E_UNKNOWNNAME == hr)
00387 {
00388 ++index;
00389
00390 hr = dispatch_parent_1_type::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
00391 }
00392
00393 if( FAILED(hr) &&
00394 DISP_E_UNKNOWNNAME == hr)
00395 {
00396 ++index;
00397
00398 hr = dispatch_parent_2_type::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
00399 }
00400
00401
00402 if(SUCCEEDED(hr))
00403 {
00404 DISPID dispidFlag = DISPID(0x1) << (8 * sizeof(DISPID) - 2);
00405
00406 dispidFlag >>= (index - 1);
00407
00408 for(UINT i = 0; i < cNames; ++i)
00409 {
00410 if(rgdispid[i] < 0)
00411 {
00412
00413
00414
00415 }
00416 else
00417 {
00418 ATLSTL_MESSAGE_ASSERT("Dispatch Id is out of range!", 0 == (dispidFlag & rgdispid[i]));
00419
00420 rgdispid[i] |= dispidFlag;
00421 }
00422 }
00423 }
00424
00425 return hr;
00426 }
00442 STDMETHOD(Invoke)( DISPID dispidMember
00443 , REFIID riid
00444 , LCID lcid
00445 , WORD wFlags
00446 , DISPPARAMS *pdispparams
00447 , VARIANT *pvarResult
00448 , EXCEPINFO *pexcepinfo
00449 , UINT *puArgErr)
00450 {
00451 if(dispidMember >= 0)
00452 {
00453 DISPID dispidFlag = DISPID(0x1) << (8 * sizeof(DISPID) - 2);
00454
00455 dispidFlag >>= 0;
00456 if(dispidMember & dispidFlag)
00457 {
00458 return dispatch_parent_0_type::Invoke(dispidMember & ~dispidFlag, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00459 }
00460
00461 dispidFlag >>= 1;
00462 if(dispidMember & dispidFlag)
00463 {
00464 return dispatch_parent_1_type::Invoke(dispidMember & ~dispidFlag, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00465 }
00466
00467 dispidFlag >>= 1;
00468 if(dispidMember & dispidFlag)
00469 {
00470 return dispatch_parent_2_type::Invoke(dispidMember & ~dispidFlag, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00471 }
00472 }
00473
00474 HRESULT hr = dispatch_parent_0_type::Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00475
00476 if( FAILED(hr) &&
00477 DISP_E_MEMBERNOTFOUND == hr)
00478 {
00479 hr = dispatch_parent_1_type::Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00480 }
00481
00482 if( FAILED(hr) &&
00483 DISP_E_MEMBERNOTFOUND == hr)
00484 {
00485 hr = dispatch_parent_2_type::Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00486 }
00487
00488 return hr;
00489 }
00491 };
00492
00502
00503 template< ss_typename_param_k I0
00504 , IID const *IID0
00505 , ss_typename_param_k I1
00506 , IID const *IID1
00507 , ss_typename_param_k I2
00508 , IID const *IID2
00509 , ss_typename_param_k I3
00510 , IID const *IID3
00511 , GUID const *LibID
00512 >
00513 class IDispatchImpl4
00514 : public IDispatchImpl<I0, IID0, LibID>
00515 , public IDispatchImpl<I1, IID1, LibID>
00516 , public IDispatchImpl<I2, IID2, LibID>
00517 , public IDispatchImpl<I3, IID3, LibID>
00518 {
00521 public:
00522 typedef IDispatchImpl<I0, IID0, LibID> dispatch_parent_0_type;
00523 typedef IDispatchImpl<I1, IID1, LibID> dispatch_parent_1_type;
00524 typedef IDispatchImpl<I2, IID2, LibID> dispatch_parent_2_type;
00525 typedef IDispatchImpl<I3, IID3, LibID> dispatch_parent_3_type;
00526
00527
00530 protected:
00551 STDMETHOD(GetIDsOfNames)( REFIID riid
00552 , LPOLESTR *rgszNames
00553 , UINT cNames
00554 , LCID lcid
00555 , DISPID *rgdispid)
00556 {
00557 unsigned index = 1;
00558 HRESULT hr = dispatch_parent_0_type::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
00559
00560 if( FAILED(hr) &&
00561 DISP_E_UNKNOWNNAME == hr)
00562 {
00563 ++index;
00564
00565 hr = dispatch_parent_1_type::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
00566 }
00567
00568 if( FAILED(hr) &&
00569 DISP_E_UNKNOWNNAME == hr)
00570 {
00571 ++index;
00572
00573 hr = dispatch_parent_2_type::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
00574 }
00575
00576 if( FAILED(hr) &&
00577 DISP_E_UNKNOWNNAME == hr)
00578 {
00579 ++index;
00580
00581 hr = dispatch_parent_3_type::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
00582 }
00583
00584
00585 if(SUCCEEDED(hr))
00586 {
00587 DISPID dispidFlag = DISPID(0x1) << (8 * sizeof(DISPID) - 2);
00588
00589 dispidFlag >>= (index - 1);
00590
00591 for(UINT i = 0; i < cNames; ++i)
00592 {
00593 if(rgdispid[i] < 0)
00594 {
00595
00596
00597
00598 }
00599 else
00600 {
00601 ATLSTL_MESSAGE_ASSERT("Dispatch Id is out of range!", 0 == (dispidFlag & rgdispid[i]));
00602
00603 rgdispid[i] |= dispidFlag;
00604 }
00605 }
00606 }
00607
00608 return hr;
00609 }
00625 STDMETHOD(Invoke)( DISPID dispidMember
00626 , REFIID riid
00627 , LCID lcid
00628 , WORD wFlags
00629 , DISPPARAMS *pdispparams
00630 , VARIANT *pvarResult
00631 , EXCEPINFO *pexcepinfo
00632 , UINT *puArgErr)
00633 {
00634 if(dispidMember >= 0)
00635 {
00636 DISPID dispidFlag = DISPID(0x1) << (8 * sizeof(DISPID) - 2);
00637
00638 dispidFlag >>= 0;
00639 if(dispidMember & dispidFlag)
00640 {
00641 return dispatch_parent_0_type::Invoke(dispidMember & ~dispidFlag, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00642 }
00643
00644 dispidFlag >>= 1;
00645 if(dispidMember & dispidFlag)
00646 {
00647 return dispatch_parent_1_type::Invoke(dispidMember & ~dispidFlag, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00648 }
00649
00650 dispidFlag >>= 1;
00651 if(dispidMember & dispidFlag)
00652 {
00653 return dispatch_parent_2_type::Invoke(dispidMember & ~dispidFlag, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00654 }
00655
00656 dispidFlag >>= 1;
00657 if(dispidMember & dispidFlag)
00658 {
00659 return dispatch_parent_3_type::Invoke(dispidMember & ~dispidFlag, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00660 }
00661 }
00662
00663 HRESULT hr = dispatch_parent_0_type::Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00664
00665 if( FAILED(hr) &&
00666 DISP_E_MEMBERNOTFOUND == hr)
00667 {
00668 hr = dispatch_parent_1_type::Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00669 }
00670
00671 if( FAILED(hr) &&
00672 DISP_E_MEMBERNOTFOUND == hr)
00673 {
00674 hr = dispatch_parent_2_type::Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00675 }
00676
00677 if( FAILED(hr) &&
00678 DISP_E_MEMBERNOTFOUND == hr)
00679 {
00680 hr = dispatch_parent_3_type::Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
00681 }
00682
00683 return hr;
00684 }
00686 };
00687
00688
00689
00690 #ifndef _ATLSTL_NO_NAMESPACE
00691 # if defined(_STLSOFT_NO_NAMESPACE) || \
00692 defined(STLSOFT_DOCUMENTATION_SKIP_SECTION)
00693 }
00694 # else
00695 }
00696 }
00697 # endif
00698 #endif
00699
00700
00701
00702 #endif
00703
00704