15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file was GENERATED by command: 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pump.py dispatch_win.h.pump 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DO NOT EDIT BY HAND!!! 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef REMOTING_BASE_IDISPATCH_DRIVER_WIN_H_ 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define REMOTING_BASE_IDISPATCH_DRIVER_WIN_H_ 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <oaidl.h> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/template_util.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_variant.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace dispatch { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A helper wrapper for |VARIANTARG| that is used to pass parameters to and from 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IDispatch::Invoke(). The latter accepts parameters as an array of 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |VARIANTARG| structures. The calling convention of IDispatch::Invoke() is: 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - [in] parameters are initialized and freed if needed by the caller. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - [out] parameters are initialized by IDispatch::Invoke(). It is up to 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the caller to free leakable variants (such as VT_DISPATCH). 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - [in] [out] parameters are combination of both: the caller initializes 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// them before the call and the callee assigns new values correctly 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// freeing leakable variants. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Using |ScopedVariantArg| instead of naked |VARIANTARG| ensures that 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the resources allocated during the call will be properly freed. It also 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// provides wrapping methods that convert between C++ types and VARIANTs. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// At the moment the only supported parameter type is |VARIANT| (or 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |VARIANTARG|). 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It must be possible to cast a pointer to an array of |ScopedVariantArg| to 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a pointer to an array of |VARIANTARG| structures. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedVariantArg : public VARIANTARG { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVariantArg() { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vt = VT_EMPTY; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedVariantArg() { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariantClear(this); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wrap() routines pack the input parameters into VARIANTARG structures so 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that they can be passed to IDispatch::Invoke. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT Wrap(const VARIANT& param) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(vt == VT_EMPTY); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return VariantCopy(this, ¶m); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT Wrap(VARIANT* const & param) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(vt == VT_EMPTY); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make the input value of an [in] [out] parameter visible to 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IDispatch::Invoke(). 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // N.B. We treat both [out] and [in] [out] parameters as [in] [out]. In 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // other words the caller is always responsible for initializing and freeing 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // [out] and [in] [out] parameters. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Swap(param); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unwrap() routines unpack the output parameters from VARIANTARG structures 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the locations specified by the caller. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Unwrap(const VARIANT& param_out) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do nothing for an [in] parameter. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Unwrap(VARIANT* const & param_out) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the output value of an [in] [out] parameter to the caller. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Swap(param_out); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Exchanges the value (and ownership) of the passed VARIANT with the one 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // wrapped by |ScopedVariantArg|. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Swap(VARIANT* other) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT temp = *other; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *other = *this; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *static_cast<VARIANTARG*>(this) = temp; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedVariantArg); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure the layouts of |VARIANTARG| and |ScopedVariantArg| are identical. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(sizeof(ScopedVariantArg) == sizeof(VARIANTARG), 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_variant_arg_should_not_add_data_members); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoke() is a convenience wrapper for IDispatch::Invoke. It takes care of 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// calling the desired method by its ID and implements logic for passing 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a variable number of in/out parameters to the called method. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The calling convention is: 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - [in] parameters are passsed as a constant reference or by value. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - [out] and [in] [out] parameters are passed by pointer. The pointed value 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is overwritten when the function returns. The pointed-to value must 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be initialized before the call, and will be replaced when it returns. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// [out] parameters may be initialized to VT_EMPTY. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Current limitations: 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - more than 7 parameters are not supported. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - the method ID cannot be cached and reused. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - VARIANT is the only supported parameter type at the moment. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT Invoke(IDispatch* object, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPOLESTR name, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WORD flags, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* const & result_out) { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the ID of the method to be called. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPID disp_id; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = object->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &disp_id); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request the return value if asked by the caller. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ScopedVariantArg result; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* disp_result = NULL; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result_out != NULL) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_result = &result; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoke the method passing the parameters via the DISPPARAMS structure. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DISPATCH_PROPERTYPUT and DISPATCH_PROPERTYPUTREF require the parameter of 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the property setter to be named, so |cNamedArgs| and |rgdispidNamedArgs| 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // structure members should be initialized. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPPARAMS disp_params = { NULL, NULL, 0, 0 }; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPID dispid_named = DISPID_PROPERTYPUT; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags == DISPATCH_PROPERTYPUT || flags == DISPATCH_PROPERTYPUTREF) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_params.cNamedArgs = 1; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_params.rgdispidNamedArgs = &dispid_named; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = object->Invoke(disp_id, IID_NULL, LOCALE_USER_DEFAULT, flags, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &disp_params, disp_result, NULL, NULL); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unwrap the return value. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result_out != NULL) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Unwrap(result_out); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename P1> 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT Invoke(IDispatch* object, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPOLESTR name, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WORD flags, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P1& p1, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* const & result_out) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the ID of the method to be called. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPID disp_id; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = object->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &disp_id); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request the return value if asked by the caller. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ScopedVariantArg result; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* disp_result = NULL; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result_out != NULL) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_result = &result; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wrap the parameters into an array of VARIANT structures. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ScopedVariantArg disp_args[1]; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[1 - 1].Wrap(p1); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoke the method passing the parameters via the DISPPARAMS structure. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DISPATCH_PROPERTYPUT and DISPATCH_PROPERTYPUTREF require the parameter of 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the property setter to be named, so |cNamedArgs| and |rgdispidNamedArgs| 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // structure members should be initialized. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPPARAMS disp_params = { disp_args, NULL, 1, 0 }; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPID dispid_named = DISPID_PROPERTYPUT; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags == DISPATCH_PROPERTYPUT || flags == DISPATCH_PROPERTYPUTREF) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_params.cNamedArgs = 1; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_params.rgdispidNamedArgs = &dispid_named; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = object->Invoke(disp_id, IID_NULL, LOCALE_USER_DEFAULT, flags, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &disp_params, disp_result, NULL, NULL); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unwrap the parameters. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[1 - 1].Unwrap(p1); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unwrap the return value. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result_out != NULL) { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Unwrap(result_out); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename P1, typename P2> 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT Invoke(IDispatch* object, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPOLESTR name, 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WORD flags, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P1& p1, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P2& p2, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* const & result_out) { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the ID of the method to be called. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPID disp_id; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = object->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &disp_id); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request the return value if asked by the caller. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ScopedVariantArg result; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* disp_result = NULL; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result_out != NULL) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_result = &result; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wrap the parameters into an array of VARIANT structures. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ScopedVariantArg disp_args[2]; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[2 - 1].Wrap(p1); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[2 - 2].Wrap(p2); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoke the method passing the parameters via the DISPPARAMS structure. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DISPATCH_PROPERTYPUT and DISPATCH_PROPERTYPUTREF require the parameter of 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the property setter to be named, so |cNamedArgs| and |rgdispidNamedArgs| 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // structure members should be initialized. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPPARAMS disp_params = { disp_args, NULL, 2, 0 }; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPID dispid_named = DISPID_PROPERTYPUT; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags == DISPATCH_PROPERTYPUT || flags == DISPATCH_PROPERTYPUTREF) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_params.cNamedArgs = 1; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_params.rgdispidNamedArgs = &dispid_named; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = object->Invoke(disp_id, IID_NULL, LOCALE_USER_DEFAULT, flags, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &disp_params, disp_result, NULL, NULL); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unwrap the parameters. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[2 - 1].Unwrap(p1); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[2 - 2].Unwrap(p2); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unwrap the return value. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result_out != NULL) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Unwrap(result_out); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename P1, typename P2, typename P3> 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT Invoke(IDispatch* object, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPOLESTR name, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WORD flags, 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P1& p1, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P2& p2, 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P3& p3, 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* const & result_out) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the ID of the method to be called. 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPID disp_id; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = object->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &disp_id); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request the return value if asked by the caller. 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ScopedVariantArg result; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* disp_result = NULL; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result_out != NULL) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_result = &result; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wrap the parameters into an array of VARIANT structures. 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ScopedVariantArg disp_args[3]; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[3 - 1].Wrap(p1); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[3 - 2].Wrap(p2); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[3 - 3].Wrap(p3); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoke the method passing the parameters via the DISPPARAMS structure. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DISPATCH_PROPERTYPUT and DISPATCH_PROPERTYPUTREF require the parameter of 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the property setter to be named, so |cNamedArgs| and |rgdispidNamedArgs| 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // structure members should be initialized. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPPARAMS disp_params = { disp_args, NULL, 3, 0 }; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPID dispid_named = DISPID_PROPERTYPUT; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags == DISPATCH_PROPERTYPUT || flags == DISPATCH_PROPERTYPUTREF) { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_params.cNamedArgs = 1; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_params.rgdispidNamedArgs = &dispid_named; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = object->Invoke(disp_id, IID_NULL, LOCALE_USER_DEFAULT, flags, 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &disp_params, disp_result, NULL, NULL); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unwrap the parameters. 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[3 - 1].Unwrap(p1); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[3 - 2].Unwrap(p2); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[3 - 3].Unwrap(p3); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unwrap the return value. 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result_out != NULL) { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Unwrap(result_out); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename P1, typename P2, typename P3, typename P4> 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT Invoke(IDispatch* object, 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPOLESTR name, 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WORD flags, 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P1& p1, 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P2& p2, 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P3& p3, 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P4& p4, 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* const & result_out) { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the ID of the method to be called. 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPID disp_id; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = object->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &disp_id); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request the return value if asked by the caller. 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ScopedVariantArg result; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* disp_result = NULL; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result_out != NULL) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_result = &result; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wrap the parameters into an array of VARIANT structures. 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ScopedVariantArg disp_args[4]; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[4 - 1].Wrap(p1); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[4 - 2].Wrap(p2); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[4 - 3].Wrap(p3); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[4 - 4].Wrap(p4); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoke the method passing the parameters via the DISPPARAMS structure. 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DISPATCH_PROPERTYPUT and DISPATCH_PROPERTYPUTREF require the parameter of 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the property setter to be named, so |cNamedArgs| and |rgdispidNamedArgs| 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // structure members should be initialized. 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPPARAMS disp_params = { disp_args, NULL, 4, 0 }; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPID dispid_named = DISPID_PROPERTYPUT; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags == DISPATCH_PROPERTYPUT || flags == DISPATCH_PROPERTYPUTREF) { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_params.cNamedArgs = 1; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_params.rgdispidNamedArgs = &dispid_named; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = object->Invoke(disp_id, IID_NULL, LOCALE_USER_DEFAULT, flags, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &disp_params, disp_result, NULL, NULL); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unwrap the parameters. 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[4 - 1].Unwrap(p1); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[4 - 2].Unwrap(p2); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[4 - 3].Unwrap(p3); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[4 - 4].Unwrap(p4); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unwrap the return value. 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result_out != NULL) { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Unwrap(result_out); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename P1, typename P2, typename P3, typename P4, typename P5> 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT Invoke(IDispatch* object, 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPOLESTR name, 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WORD flags, 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P1& p1, 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P2& p2, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P3& p3, 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P4& p4, 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P5& p5, 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* const & result_out) { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the ID of the method to be called. 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPID disp_id; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = object->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &disp_id); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request the return value if asked by the caller. 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ScopedVariantArg result; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* disp_result = NULL; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result_out != NULL) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_result = &result; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wrap the parameters into an array of VARIANT structures. 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ScopedVariantArg disp_args[5]; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[5 - 1].Wrap(p1); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[5 - 2].Wrap(p2); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[5 - 3].Wrap(p3); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[5 - 4].Wrap(p4); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[5 - 5].Wrap(p5); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoke the method passing the parameters via the DISPPARAMS structure. 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DISPATCH_PROPERTYPUT and DISPATCH_PROPERTYPUTREF require the parameter of 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the property setter to be named, so |cNamedArgs| and |rgdispidNamedArgs| 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // structure members should be initialized. 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPPARAMS disp_params = { disp_args, NULL, 5, 0 }; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPID dispid_named = DISPID_PROPERTYPUT; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags == DISPATCH_PROPERTYPUT || flags == DISPATCH_PROPERTYPUTREF) { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_params.cNamedArgs = 1; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_params.rgdispidNamedArgs = &dispid_named; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = object->Invoke(disp_id, IID_NULL, LOCALE_USER_DEFAULT, flags, 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &disp_params, disp_result, NULL, NULL); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unwrap the parameters. 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[5 - 1].Unwrap(p1); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[5 - 2].Unwrap(p2); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[5 - 3].Unwrap(p3); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[5 - 4].Unwrap(p4); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[5 - 5].Unwrap(p5); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unwrap the return value. 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result_out != NULL) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Unwrap(result_out); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename P1, typename P2, typename P3, typename P4, typename P5, 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename P6> 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT Invoke(IDispatch* object, 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPOLESTR name, 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WORD flags, 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P1& p1, 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P2& p2, 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P3& p3, 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P4& p4, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P5& p5, 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P6& p6, 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* const & result_out) { 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the ID of the method to be called. 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPID disp_id; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = object->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &disp_id); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request the return value if asked by the caller. 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ScopedVariantArg result; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* disp_result = NULL; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result_out != NULL) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_result = &result; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wrap the parameters into an array of VARIANT structures. 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ScopedVariantArg disp_args[6]; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[6 - 1].Wrap(p1); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[6 - 2].Wrap(p2); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[6 - 3].Wrap(p3); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[6 - 4].Wrap(p4); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[6 - 5].Wrap(p5); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[6 - 6].Wrap(p6); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoke the method passing the parameters via the DISPPARAMS structure. 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DISPATCH_PROPERTYPUT and DISPATCH_PROPERTYPUTREF require the parameter of 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the property setter to be named, so |cNamedArgs| and |rgdispidNamedArgs| 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // structure members should be initialized. 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPPARAMS disp_params = { disp_args, NULL, 6, 0 }; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPID dispid_named = DISPID_PROPERTYPUT; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags == DISPATCH_PROPERTYPUT || flags == DISPATCH_PROPERTYPUTREF) { 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_params.cNamedArgs = 1; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_params.rgdispidNamedArgs = &dispid_named; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = object->Invoke(disp_id, IID_NULL, LOCALE_USER_DEFAULT, flags, 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &disp_params, disp_result, NULL, NULL); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unwrap the parameters. 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[6 - 1].Unwrap(p1); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[6 - 2].Unwrap(p2); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[6 - 3].Unwrap(p3); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[6 - 4].Unwrap(p4); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[6 - 5].Unwrap(p5); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[6 - 6].Unwrap(p6); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unwrap the return value. 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result_out != NULL) { 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Unwrap(result_out); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename P1, typename P2, typename P3, typename P4, typename P5, 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename P6, typename P7> 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT Invoke(IDispatch* object, 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPOLESTR name, 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WORD flags, 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P1& p1, 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P2& p2, 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P3& p3, 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P4& p4, 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P5& p5, 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P6& p6, 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P7& p7, 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* const & result_out) { 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the ID of the method to be called. 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPID disp_id; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = object->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &disp_id); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request the return value if asked by the caller. 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ScopedVariantArg result; 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* disp_result = NULL; 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result_out != NULL) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_result = &result; 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wrap the parameters into an array of VARIANT structures. 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ScopedVariantArg disp_args[7]; 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[7 - 1].Wrap(p1); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[7 - 2].Wrap(p2); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[7 - 3].Wrap(p3); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[7 - 4].Wrap(p4); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[7 - 5].Wrap(p5); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[7 - 6].Wrap(p6); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = disp_args[7 - 7].Wrap(p7); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoke the method passing the parameters via the DISPPARAMS structure. 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DISPATCH_PROPERTYPUT and DISPATCH_PROPERTYPUTREF require the parameter of 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the property setter to be named, so |cNamedArgs| and |rgdispidNamedArgs| 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // structure members should be initialized. 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPPARAMS disp_params = { disp_args, NULL, 7, 0 }; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISPID dispid_named = DISPID_PROPERTYPUT; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags == DISPATCH_PROPERTYPUT || flags == DISPATCH_PROPERTYPUTREF) { 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_params.cNamedArgs = 1; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_params.rgdispidNamedArgs = &dispid_named; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = object->Invoke(disp_id, IID_NULL, LOCALE_USER_DEFAULT, flags, 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &disp_params, disp_result, NULL, NULL); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unwrap the parameters. 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[7 - 1].Unwrap(p1); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[7 - 2].Unwrap(p2); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[7 - 3].Unwrap(p3); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[7 - 4].Unwrap(p4); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[7 - 5].Unwrap(p5); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[7 - 6].Unwrap(p6); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disp_args[7 - 7].Unwrap(p7); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unwrap the return value. 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result_out != NULL) { 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Unwrap(result_out); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace dispatch 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // REMOTING_BASE_IDISPATCH_DRIVER_WIN_H_ 638