123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645 |
- // This file was GENERATED by command:
- // pump.py dispatch_win.h.pump
- // DO NOT EDIT BY HAND!!!
- // Copyright (c) 2012 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef REMOTING_BASE_DISPATCH_WIN_H_
- #define REMOTING_BASE_DISPATCH_WIN_H_
- #include <oaidl.h>
- #include "base/template_util.h"
- #include "base/win/scoped_variant.h"
- namespace remoting {
- namespace dispatch {
- namespace internal {
- // A helper wrapper for |VARIANTARG| that is used to pass parameters to and from
- // IDispatch::Invoke(). The latter accepts parameters as an array of
- // |VARIANTARG| structures. The calling convention of IDispatch::Invoke() is:
- // - [in] parameters are initialized and freed if needed by the caller.
- // - [out] parameters are initialized by IDispatch::Invoke(). It is up to
- // the caller to free leakable variants (such as VT_DISPATCH).
- // - [in] [out] parameters are combination of both: the caller initializes
- // them before the call and the callee assigns new values correctly
- // freeing leakable variants.
- //
- // Using |ScopedVariantArg| instead of naked |VARIANTARG| ensures that
- // the resources allocated during the call will be properly freed. It also
- // provides wrapping methods that convert between C++ types and VARIANTs.
- // At the moment the only supported parameter type is |VARIANT| (or
- // |VARIANTARG|).
- //
- // It must be possible to cast a pointer to an array of |ScopedVariantArg| to
- // a pointer to an array of |VARIANTARG| structures.
- class ScopedVariantArg : public VARIANTARG {
- public:
- ScopedVariantArg() {
- vt = VT_EMPTY;
- }
- ScopedVariantArg(const ScopedVariantArg&) = delete;
- ScopedVariantArg& operator=(const ScopedVariantArg&) = delete;
- ~ScopedVariantArg() {
- VariantClear(this);
- }
- // Wrap() routines pack the input parameters into VARIANTARG structures so
- // that they can be passed to IDispatch::Invoke.
- HRESULT Wrap(const VARIANT& param) {
- DCHECK(vt == VT_EMPTY);
- return VariantCopy(this, ¶m);
- }
- HRESULT Wrap(VARIANT* const & param) {
- DCHECK(vt == VT_EMPTY);
- // Make the input value of an [in] [out] parameter visible to
- // IDispatch::Invoke().
- //
- // N.B. We treat both [out] and [in] [out] parameters as [in] [out]. In
- // other words the caller is always responsible for initializing and freeing
- // [out] and [in] [out] parameters.
- Swap(param);
- return S_OK;
- }
- // Unwrap() routines unpack the output parameters from VARIANTARG structures
- // to the locations specified by the caller.
- void Unwrap(const VARIANT& param_out) {
- // Do nothing for an [in] parameter.
- }
- void Unwrap(VARIANT* const & param_out) {
- // Return the output value of an [in] [out] parameter to the caller.
- Swap(param_out);
- }
- private:
- // Exchanges the value (and ownership) of the passed VARIANT with the one
- // wrapped by |ScopedVariantArg|.
- void Swap(VARIANT* other) {
- VARIANT temp = *other;
- *other = *this;
- *static_cast<VARIANTARG*>(this) = temp;
- }
- };
- // Make sure the layouts of |VARIANTARG| and |ScopedVariantArg| are identical.
- static_assert(sizeof(ScopedVariantArg) == sizeof(VARIANTARG),
- "scoped variant arg should not add data members");
- } // namespace internal
- // Invoke() is a convenience wrapper for IDispatch::Invoke. It takes care of
- // calling the desired method by its ID and implements logic for passing
- // a variable number of in/out parameters to the called method.
- //
- // The calling convention is:
- // - [in] parameters are passsed as a constant reference or by value.
- // - [out] and [in] [out] parameters are passed by pointer. The pointed value
- // is overwritten when the function returns. The pointed-to value must
- // be initialized before the call, and will be replaced when it returns.
- // [out] parameters may be initialized to VT_EMPTY.
- //
- // Current limitations:
- // - more than 7 parameters are not supported.
- // - the method ID cannot be cached and reused.
- // - VARIANT is the only supported parameter type at the moment.
- HRESULT Invoke(IDispatch* object,
- LPCOLESTR const_name,
- WORD flags,
- VARIANT* const & result_out) {
- // Retrieve the ID of the method to be called.
- DISPID disp_id;
- LPOLESTR name = const_cast<LPOLESTR>(const_name);
- HRESULT hr = object->GetIDsOfNames(
- IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &disp_id);
- if (FAILED(hr))
- return hr;
- // Request the return value if asked by the caller.
- internal::ScopedVariantArg result;
- VARIANT* disp_result = NULL;
- if (result_out != NULL)
- disp_result = &result;
- // Invoke the method passing the parameters via the DISPPARAMS structure.
- // DISPATCH_PROPERTYPUT and DISPATCH_PROPERTYPUTREF require the parameter of
- // the property setter to be named, so |cNamedArgs| and |rgdispidNamedArgs|
- // structure members should be initialized.
- DISPPARAMS disp_params = { NULL, NULL, 0, 0 };
- DISPID dispid_named = DISPID_PROPERTYPUT;
- if (flags == DISPATCH_PROPERTYPUT || flags == DISPATCH_PROPERTYPUTREF) {
- disp_params.cNamedArgs = 1;
- disp_params.rgdispidNamedArgs = &dispid_named;
- }
- hr = object->Invoke(disp_id, IID_NULL, LOCALE_USER_DEFAULT, flags,
- &disp_params, disp_result, NULL, NULL);
- if (FAILED(hr))
- return hr;
- // Unwrap the return value.
- if (result_out != NULL) {
- result.Unwrap(result_out);
- }
- return S_OK;
- }
- template <typename P1>
- HRESULT Invoke(IDispatch* object,
- LPCOLESTR const_name,
- WORD flags,
- const P1& p1,
- VARIANT* const & result_out) {
- // Retrieve the ID of the method to be called.
- DISPID disp_id;
- LPOLESTR name = const_cast<LPOLESTR>(const_name);
- HRESULT hr = object->GetIDsOfNames(
- IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &disp_id);
- if (FAILED(hr))
- return hr;
- // Request the return value if asked by the caller.
- internal::ScopedVariantArg result;
- VARIANT* disp_result = NULL;
- if (result_out != NULL)
- disp_result = &result;
- // Wrap the parameters into an array of VARIANT structures.
- internal::ScopedVariantArg disp_args[1];
- hr = disp_args[1 - 1].Wrap(p1);
- if (FAILED(hr))
- return hr;
- // Invoke the method passing the parameters via the DISPPARAMS structure.
- // DISPATCH_PROPERTYPUT and DISPATCH_PROPERTYPUTREF require the parameter of
- // the property setter to be named, so |cNamedArgs| and |rgdispidNamedArgs|
- // structure members should be initialized.
- DISPPARAMS disp_params = { disp_args, NULL, 1, 0 };
- DISPID dispid_named = DISPID_PROPERTYPUT;
- if (flags == DISPATCH_PROPERTYPUT || flags == DISPATCH_PROPERTYPUTREF) {
- disp_params.cNamedArgs = 1;
- disp_params.rgdispidNamedArgs = &dispid_named;
- }
- hr = object->Invoke(disp_id, IID_NULL, LOCALE_USER_DEFAULT, flags,
- &disp_params, disp_result, NULL, NULL);
- if (FAILED(hr))
- return hr;
- // Unwrap the parameters.
- disp_args[1 - 1].Unwrap(p1);
- // Unwrap the return value.
- if (result_out != NULL) {
- result.Unwrap(result_out);
- }
- return S_OK;
- }
- template <typename P1, typename P2>
- HRESULT Invoke(IDispatch* object,
- LPCOLESTR const_name,
- WORD flags,
- const P1& p1,
- const P2& p2,
- VARIANT* const & result_out) {
- // Retrieve the ID of the method to be called.
- DISPID disp_id;
- LPOLESTR name = const_cast<LPOLESTR>(const_name);
- HRESULT hr = object->GetIDsOfNames(
- IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &disp_id);
- if (FAILED(hr))
- return hr;
- // Request the return value if asked by the caller.
- internal::ScopedVariantArg result;
- VARIANT* disp_result = NULL;
- if (result_out != NULL)
- disp_result = &result;
- // Wrap the parameters into an array of VARIANT structures.
- internal::ScopedVariantArg disp_args[2];
- hr = disp_args[2 - 1].Wrap(p1);
- if (FAILED(hr))
- return hr;
- hr = disp_args[2 - 2].Wrap(p2);
- if (FAILED(hr))
- return hr;
- // Invoke the method passing the parameters via the DISPPARAMS structure.
- // DISPATCH_PROPERTYPUT and DISPATCH_PROPERTYPUTREF require the parameter of
- // the property setter to be named, so |cNamedArgs| and |rgdispidNamedArgs|
- // structure members should be initialized.
- DISPPARAMS disp_params = { disp_args, NULL, 2, 0 };
- DISPID dispid_named = DISPID_PROPERTYPUT;
- if (flags == DISPATCH_PROPERTYPUT || flags == DISPATCH_PROPERTYPUTREF) {
- disp_params.cNamedArgs = 1;
- disp_params.rgdispidNamedArgs = &dispid_named;
- }
- hr = object->Invoke(disp_id, IID_NULL, LOCALE_USER_DEFAULT, flags,
- &disp_params, disp_result, NULL, NULL);
- if (FAILED(hr))
- return hr;
- // Unwrap the parameters.
- disp_args[2 - 1].Unwrap(p1);
- disp_args[2 - 2].Unwrap(p2);
- // Unwrap the return value.
- if (result_out != NULL) {
- result.Unwrap(result_out);
- }
- return S_OK;
- }
- template <typename P1, typename P2, typename P3>
- HRESULT Invoke(IDispatch* object,
- LPCOLESTR const_name,
- WORD flags,
- const P1& p1,
- const P2& p2,
- const P3& p3,
- VARIANT* const & result_out) {
- // Retrieve the ID of the method to be called.
- DISPID disp_id;
- LPOLESTR name = const_cast<LPOLESTR>(const_name);
- HRESULT hr = object->GetIDsOfNames(
- IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &disp_id);
- if (FAILED(hr))
- return hr;
- // Request the return value if asked by the caller.
- internal::ScopedVariantArg result;
- VARIANT* disp_result = NULL;
- if (result_out != NULL)
- disp_result = &result;
- // Wrap the parameters into an array of VARIANT structures.
- internal::ScopedVariantArg disp_args[3];
- hr = disp_args[3 - 1].Wrap(p1);
- if (FAILED(hr))
- return hr;
- hr = disp_args[3 - 2].Wrap(p2);
- if (FAILED(hr))
- return hr;
- hr = disp_args[3 - 3].Wrap(p3);
- if (FAILED(hr))
- return hr;
- // Invoke the method passing the parameters via the DISPPARAMS structure.
- // DISPATCH_PROPERTYPUT and DISPATCH_PROPERTYPUTREF require the parameter of
- // the property setter to be named, so |cNamedArgs| and |rgdispidNamedArgs|
- // structure members should be initialized.
- DISPPARAMS disp_params = { disp_args, NULL, 3, 0 };
- DISPID dispid_named = DISPID_PROPERTYPUT;
- if (flags == DISPATCH_PROPERTYPUT || flags == DISPATCH_PROPERTYPUTREF) {
- disp_params.cNamedArgs = 1;
- disp_params.rgdispidNamedArgs = &dispid_named;
- }
- hr = object->Invoke(disp_id, IID_NULL, LOCALE_USER_DEFAULT, flags,
- &disp_params, disp_result, NULL, NULL);
- if (FAILED(hr))
- return hr;
- // Unwrap the parameters.
- disp_args[3 - 1].Unwrap(p1);
- disp_args[3 - 2].Unwrap(p2);
- disp_args[3 - 3].Unwrap(p3);
- // Unwrap the return value.
- if (result_out != NULL) {
- result.Unwrap(result_out);
- }
- return S_OK;
- }
- template <typename P1, typename P2, typename P3, typename P4>
- HRESULT Invoke(IDispatch* object,
- LPCOLESTR const_name,
- WORD flags,
- const P1& p1,
- const P2& p2,
- const P3& p3,
- const P4& p4,
- VARIANT* const & result_out) {
- // Retrieve the ID of the method to be called.
- DISPID disp_id;
- LPOLESTR name = const_cast<LPOLESTR>(const_name);
- HRESULT hr = object->GetIDsOfNames(
- IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &disp_id);
- if (FAILED(hr))
- return hr;
- // Request the return value if asked by the caller.
- internal::ScopedVariantArg result;
- VARIANT* disp_result = NULL;
- if (result_out != NULL)
- disp_result = &result;
- // Wrap the parameters into an array of VARIANT structures.
- internal::ScopedVariantArg disp_args[4];
- hr = disp_args[4 - 1].Wrap(p1);
- if (FAILED(hr))
- return hr;
- hr = disp_args[4 - 2].Wrap(p2);
- if (FAILED(hr))
- return hr;
- hr = disp_args[4 - 3].Wrap(p3);
- if (FAILED(hr))
- return hr;
- hr = disp_args[4 - 4].Wrap(p4);
- if (FAILED(hr))
- return hr;
- // Invoke the method passing the parameters via the DISPPARAMS structure.
- // DISPATCH_PROPERTYPUT and DISPATCH_PROPERTYPUTREF require the parameter of
- // the property setter to be named, so |cNamedArgs| and |rgdispidNamedArgs|
- // structure members should be initialized.
- DISPPARAMS disp_params = { disp_args, NULL, 4, 0 };
- DISPID dispid_named = DISPID_PROPERTYPUT;
- if (flags == DISPATCH_PROPERTYPUT || flags == DISPATCH_PROPERTYPUTREF) {
- disp_params.cNamedArgs = 1;
- disp_params.rgdispidNamedArgs = &dispid_named;
- }
- hr = object->Invoke(disp_id, IID_NULL, LOCALE_USER_DEFAULT, flags,
- &disp_params, disp_result, NULL, NULL);
- if (FAILED(hr))
- return hr;
- // Unwrap the parameters.
- disp_args[4 - 1].Unwrap(p1);
- disp_args[4 - 2].Unwrap(p2);
- disp_args[4 - 3].Unwrap(p3);
- disp_args[4 - 4].Unwrap(p4);
- // Unwrap the return value.
- if (result_out != NULL) {
- result.Unwrap(result_out);
- }
- return S_OK;
- }
- template <typename P1, typename P2, typename P3, typename P4, typename P5>
- HRESULT Invoke(IDispatch* object,
- LPCOLESTR const_name,
- WORD flags,
- const P1& p1,
- const P2& p2,
- const P3& p3,
- const P4& p4,
- const P5& p5,
- VARIANT* const & result_out) {
- // Retrieve the ID of the method to be called.
- DISPID disp_id;
- LPOLESTR name = const_cast<LPOLESTR>(const_name);
- HRESULT hr = object->GetIDsOfNames(
- IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &disp_id);
- if (FAILED(hr))
- return hr;
- // Request the return value if asked by the caller.
- internal::ScopedVariantArg result;
- VARIANT* disp_result = NULL;
- if (result_out != NULL)
- disp_result = &result;
- // Wrap the parameters into an array of VARIANT structures.
- internal::ScopedVariantArg disp_args[5];
- hr = disp_args[5 - 1].Wrap(p1);
- if (FAILED(hr))
- return hr;
- hr = disp_args[5 - 2].Wrap(p2);
- if (FAILED(hr))
- return hr;
- hr = disp_args[5 - 3].Wrap(p3);
- if (FAILED(hr))
- return hr;
- hr = disp_args[5 - 4].Wrap(p4);
- if (FAILED(hr))
- return hr;
- hr = disp_args[5 - 5].Wrap(p5);
- if (FAILED(hr))
- return hr;
- // Invoke the method passing the parameters via the DISPPARAMS structure.
- // DISPATCH_PROPERTYPUT and DISPATCH_PROPERTYPUTREF require the parameter of
- // the property setter to be named, so |cNamedArgs| and |rgdispidNamedArgs|
- // structure members should be initialized.
- DISPPARAMS disp_params = { disp_args, NULL, 5, 0 };
- DISPID dispid_named = DISPID_PROPERTYPUT;
- if (flags == DISPATCH_PROPERTYPUT || flags == DISPATCH_PROPERTYPUTREF) {
- disp_params.cNamedArgs = 1;
- disp_params.rgdispidNamedArgs = &dispid_named;
- }
- hr = object->Invoke(disp_id, IID_NULL, LOCALE_USER_DEFAULT, flags,
- &disp_params, disp_result, NULL, NULL);
- if (FAILED(hr))
- return hr;
- // Unwrap the parameters.
- disp_args[5 - 1].Unwrap(p1);
- disp_args[5 - 2].Unwrap(p2);
- disp_args[5 - 3].Unwrap(p3);
- disp_args[5 - 4].Unwrap(p4);
- disp_args[5 - 5].Unwrap(p5);
- // Unwrap the return value.
- if (result_out != NULL) {
- result.Unwrap(result_out);
- }
- return S_OK;
- }
- template <typename P1, typename P2, typename P3, typename P4, typename P5,
- typename P6>
- HRESULT Invoke(IDispatch* object,
- LPCOLESTR const_name,
- WORD flags,
- const P1& p1,
- const P2& p2,
- const P3& p3,
- const P4& p4,
- const P5& p5,
- const P6& p6,
- VARIANT* const & result_out) {
- // Retrieve the ID of the method to be called.
- DISPID disp_id;
- LPOLESTR name = const_cast<LPOLESTR>(const_name);
- HRESULT hr = object->GetIDsOfNames(
- IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &disp_id);
- if (FAILED(hr))
- return hr;
- // Request the return value if asked by the caller.
- internal::ScopedVariantArg result;
- VARIANT* disp_result = NULL;
- if (result_out != NULL)
- disp_result = &result;
- // Wrap the parameters into an array of VARIANT structures.
- internal::ScopedVariantArg disp_args[6];
- hr = disp_args[6 - 1].Wrap(p1);
- if (FAILED(hr))
- return hr;
- hr = disp_args[6 - 2].Wrap(p2);
- if (FAILED(hr))
- return hr;
- hr = disp_args[6 - 3].Wrap(p3);
- if (FAILED(hr))
- return hr;
- hr = disp_args[6 - 4].Wrap(p4);
- if (FAILED(hr))
- return hr;
- hr = disp_args[6 - 5].Wrap(p5);
- if (FAILED(hr))
- return hr;
- hr = disp_args[6 - 6].Wrap(p6);
- if (FAILED(hr))
- return hr;
- // Invoke the method passing the parameters via the DISPPARAMS structure.
- // DISPATCH_PROPERTYPUT and DISPATCH_PROPERTYPUTREF require the parameter of
- // the property setter to be named, so |cNamedArgs| and |rgdispidNamedArgs|
- // structure members should be initialized.
- DISPPARAMS disp_params = { disp_args, NULL, 6, 0 };
- DISPID dispid_named = DISPID_PROPERTYPUT;
- if (flags == DISPATCH_PROPERTYPUT || flags == DISPATCH_PROPERTYPUTREF) {
- disp_params.cNamedArgs = 1;
- disp_params.rgdispidNamedArgs = &dispid_named;
- }
- hr = object->Invoke(disp_id, IID_NULL, LOCALE_USER_DEFAULT, flags,
- &disp_params, disp_result, NULL, NULL);
- if (FAILED(hr))
- return hr;
- // Unwrap the parameters.
- disp_args[6 - 1].Unwrap(p1);
- disp_args[6 - 2].Unwrap(p2);
- disp_args[6 - 3].Unwrap(p3);
- disp_args[6 - 4].Unwrap(p4);
- disp_args[6 - 5].Unwrap(p5);
- disp_args[6 - 6].Unwrap(p6);
- // Unwrap the return value.
- if (result_out != NULL) {
- result.Unwrap(result_out);
- }
- return S_OK;
- }
- template <typename P1, typename P2, typename P3, typename P4, typename P5,
- typename P6, typename P7>
- HRESULT Invoke(IDispatch* object,
- LPCOLESTR const_name,
- WORD flags,
- const P1& p1,
- const P2& p2,
- const P3& p3,
- const P4& p4,
- const P5& p5,
- const P6& p6,
- const P7& p7,
- VARIANT* const & result_out) {
- // Retrieve the ID of the method to be called.
- DISPID disp_id;
- LPOLESTR name = const_cast<LPOLESTR>(const_name);
- HRESULT hr = object->GetIDsOfNames(
- IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &disp_id);
- if (FAILED(hr))
- return hr;
- // Request the return value if asked by the caller.
- internal::ScopedVariantArg result;
- VARIANT* disp_result = NULL;
- if (result_out != NULL)
- disp_result = &result;
- // Wrap the parameters into an array of VARIANT structures.
- internal::ScopedVariantArg disp_args[7];
- hr = disp_args[7 - 1].Wrap(p1);
- if (FAILED(hr))
- return hr;
- hr = disp_args[7 - 2].Wrap(p2);
- if (FAILED(hr))
- return hr;
- hr = disp_args[7 - 3].Wrap(p3);
- if (FAILED(hr))
- return hr;
- hr = disp_args[7 - 4].Wrap(p4);
- if (FAILED(hr))
- return hr;
- hr = disp_args[7 - 5].Wrap(p5);
- if (FAILED(hr))
- return hr;
- hr = disp_args[7 - 6].Wrap(p6);
- if (FAILED(hr))
- return hr;
- hr = disp_args[7 - 7].Wrap(p7);
- if (FAILED(hr))
- return hr;
- // Invoke the method passing the parameters via the DISPPARAMS structure.
- // DISPATCH_PROPERTYPUT and DISPATCH_PROPERTYPUTREF require the parameter of
- // the property setter to be named, so |cNamedArgs| and |rgdispidNamedArgs|
- // structure members should be initialized.
- DISPPARAMS disp_params = { disp_args, NULL, 7, 0 };
- DISPID dispid_named = DISPID_PROPERTYPUT;
- if (flags == DISPATCH_PROPERTYPUT || flags == DISPATCH_PROPERTYPUTREF) {
- disp_params.cNamedArgs = 1;
- disp_params.rgdispidNamedArgs = &dispid_named;
- }
- hr = object->Invoke(disp_id, IID_NULL, LOCALE_USER_DEFAULT, flags,
- &disp_params, disp_result, NULL, NULL);
- if (FAILED(hr))
- return hr;
- // Unwrap the parameters.
- disp_args[7 - 1].Unwrap(p1);
- disp_args[7 - 2].Unwrap(p2);
- disp_args[7 - 3].Unwrap(p3);
- disp_args[7 - 4].Unwrap(p4);
- disp_args[7 - 5].Unwrap(p5);
- disp_args[7 - 6].Unwrap(p6);
- disp_args[7 - 7].Unwrap(p7);
- // Unwrap the return value.
- if (result_out != NULL) {
- result.Unwrap(result_out);
- }
- return S_OK;
- }
- } // namespace dispatch
- } // namespace remoting
- #endif // REMOTING_BASE_DISPATCH_WIN_H_
|