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, &param);
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