/*** Autogenerated by WIDL 9.5 from include/wsdclient.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __wsdclient_h__
#define __wsdclient_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __IWSDAsyncResult_FWD_DEFINED__
#define __IWSDAsyncResult_FWD_DEFINED__
typedef interface IWSDAsyncResult IWSDAsyncResult;
#ifdef __cplusplus
interface IWSDAsyncResult;
#endif /* __cplusplus */
#endif

#ifndef __IWSDAsyncCallback_FWD_DEFINED__
#define __IWSDAsyncCallback_FWD_DEFINED__
typedef interface IWSDAsyncCallback IWSDAsyncCallback;
#ifdef __cplusplus
interface IWSDAsyncCallback;
#endif /* __cplusplus */
#endif

#ifndef __IWSDMetadataExchange_FWD_DEFINED__
#define __IWSDMetadataExchange_FWD_DEFINED__
typedef interface IWSDMetadataExchange IWSDMetadataExchange;
#ifdef __cplusplus
interface IWSDMetadataExchange;
#endif /* __cplusplus */
#endif

#ifndef __IWSDEventingStatus_FWD_DEFINED__
#define __IWSDEventingStatus_FWD_DEFINED__
typedef interface IWSDEventingStatus IWSDEventingStatus;
#ifdef __cplusplus
interface IWSDEventingStatus;
#endif /* __cplusplus */
#endif

#ifndef __IWSDEndpointProxy_FWD_DEFINED__
#define __IWSDEndpointProxy_FWD_DEFINED__
typedef interface IWSDEndpointProxy IWSDEndpointProxy;
#ifdef __cplusplus
interface IWSDEndpointProxy;
#endif /* __cplusplus */
#endif

#ifndef __IWSDDeviceProxy_FWD_DEFINED__
#define __IWSDDeviceProxy_FWD_DEFINED__
typedef interface IWSDDeviceProxy IWSDDeviceProxy;
#ifdef __cplusplus
interface IWSDDeviceProxy;
#endif /* __cplusplus */
#endif

#ifndef __IWSDServiceProxy_FWD_DEFINED__
#define __IWSDServiceProxy_FWD_DEFINED__
typedef interface IWSDServiceProxy IWSDServiceProxy;
#ifdef __cplusplus
interface IWSDServiceProxy;
#endif /* __cplusplus */
#endif

#ifndef __IWSDServiceProxyEventing_FWD_DEFINED__
#define __IWSDServiceProxyEventing_FWD_DEFINED__
typedef interface IWSDServiceProxyEventing IWSDServiceProxyEventing;
#ifdef __cplusplus
interface IWSDServiceProxyEventing;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <oaidl.h>
#include <ocidl.h>
#include <wsdxmldom.h>
#include <wsdtypes.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

#ifndef __IWSDAddress_FWD_DEFINED__
#define __IWSDAddress_FWD_DEFINED__
typedef interface IWSDAddress IWSDAddress;
#ifdef __cplusplus
interface IWSDAddress;
#endif /* __cplusplus */
#endif

#ifndef __IWSDXMLContext_FWD_DEFINED__
#define __IWSDXMLContext_FWD_DEFINED__
typedef interface IWSDXMLContext IWSDXMLContext;
#ifdef __cplusplus
interface IWSDXMLContext;
#endif /* __cplusplus */
#endif

#ifndef __IWSDiscoveredService_FWD_DEFINED__
#define __IWSDiscoveredService_FWD_DEFINED__
typedef interface IWSDiscoveredService IWSDiscoveredService;
#ifdef __cplusplus
interface IWSDiscoveredService;
#endif /* __cplusplus */
#endif

#ifndef __IWSDDeviceProxy_FWD_DEFINED__
#define __IWSDDeviceProxy_FWD_DEFINED__
typedef interface IWSDDeviceProxy IWSDDeviceProxy;
#ifdef __cplusplus
interface IWSDDeviceProxy;
#endif /* __cplusplus */
#endif

#ifndef __IWSDServiceProxy_FWD_DEFINED__
#define __IWSDServiceProxy_FWD_DEFINED__
typedef interface IWSDServiceProxy IWSDServiceProxy;
#ifdef __cplusplus
interface IWSDServiceProxy;
#endif /* __cplusplus */
#endif

#ifndef __IWSDEndpointProxy_FWD_DEFINED__
#define __IWSDEndpointProxy_FWD_DEFINED__
typedef interface IWSDEndpointProxy IWSDEndpointProxy;
#ifdef __cplusplus
interface IWSDEndpointProxy;
#endif /* __cplusplus */
#endif

#ifndef __IWSDAsyncResult_FWD_DEFINED__
#define __IWSDAsyncResult_FWD_DEFINED__
typedef interface IWSDAsyncResult IWSDAsyncResult;
#ifdef __cplusplus
interface IWSDAsyncResult;
#endif /* __cplusplus */
#endif

#ifndef __IWSDAsyncCallback_FWD_DEFINED__
#define __IWSDAsyncCallback_FWD_DEFINED__
typedef interface IWSDAsyncCallback IWSDAsyncCallback;
#ifdef __cplusplus
interface IWSDAsyncCallback;
#endif /* __cplusplus */
#endif

#ifndef __IWSDMetadataExchange_FWD_DEFINED__
#define __IWSDMetadataExchange_FWD_DEFINED__
typedef interface IWSDMetadataExchange IWSDMetadataExchange;
#ifdef __cplusplus
interface IWSDMetadataExchange;
#endif /* __cplusplus */
#endif

#ifndef __IWSDEventingStatus_FWD_DEFINED__
#define __IWSDEventingStatus_FWD_DEFINED__
typedef interface IWSDEventingStatus IWSDEventingStatus;
#ifdef __cplusplus
interface IWSDEventingStatus;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IWSDAsyncResult interface
 */
#ifndef __IWSDAsyncResult_INTERFACE_DEFINED__
#define __IWSDAsyncResult_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDAsyncResult, 0x11a9852a, 0x8dd8, 0x423e, 0xb5,0x37, 0x93,0x56,0xdb,0x4f,0xbf,0xb8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("11a9852a-8dd8-423e-b537-9356db4fbfb8")
IWSDAsyncResult : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetCallback(
        IWSDAsyncCallback *pCallback,
        IUnknown *pAsyncState) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetWaitHandle(
        HANDLE hWaitHandle) = 0;

    virtual HRESULT STDMETHODCALLTYPE HasCompleted(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAsyncState(
        IUnknown **ppAsyncState) = 0;

    virtual HRESULT STDMETHODCALLTYPE Abort(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEvent(
        WSD_EVENT *pEvent) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEndpointProxy(
        IWSDEndpointProxy **ppEndpoint) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDAsyncResult, 0x11a9852a, 0x8dd8, 0x423e, 0xb5,0x37, 0x93,0x56,0xdb,0x4f,0xbf,0xb8)
#endif
#else
typedef struct IWSDAsyncResultVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDAsyncResult *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDAsyncResult *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDAsyncResult *This);

    /*** IWSDAsyncResult methods ***/
    HRESULT (STDMETHODCALLTYPE *SetCallback)(
        IWSDAsyncResult *This,
        IWSDAsyncCallback *pCallback,
        IUnknown *pAsyncState);

    HRESULT (STDMETHODCALLTYPE *SetWaitHandle)(
        IWSDAsyncResult *This,
        HANDLE hWaitHandle);

    HRESULT (STDMETHODCALLTYPE *HasCompleted)(
        IWSDAsyncResult *This);

    HRESULT (STDMETHODCALLTYPE *GetAsyncState)(
        IWSDAsyncResult *This,
        IUnknown **ppAsyncState);

    HRESULT (STDMETHODCALLTYPE *Abort)(
        IWSDAsyncResult *This);

    HRESULT (STDMETHODCALLTYPE *GetEvent)(
        IWSDAsyncResult *This,
        WSD_EVENT *pEvent);

    HRESULT (STDMETHODCALLTYPE *GetEndpointProxy)(
        IWSDAsyncResult *This,
        IWSDEndpointProxy **ppEndpoint);

    END_INTERFACE
} IWSDAsyncResultVtbl;

interface IWSDAsyncResult {
    CONST_VTBL IWSDAsyncResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDAsyncResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDAsyncResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDAsyncResult_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDAsyncResult methods ***/
#define IWSDAsyncResult_SetCallback(This,pCallback,pAsyncState) (This)->lpVtbl->SetCallback(This,pCallback,pAsyncState)
#define IWSDAsyncResult_SetWaitHandle(This,hWaitHandle) (This)->lpVtbl->SetWaitHandle(This,hWaitHandle)
#define IWSDAsyncResult_HasCompleted(This) (This)->lpVtbl->HasCompleted(This)
#define IWSDAsyncResult_GetAsyncState(This,ppAsyncState) (This)->lpVtbl->GetAsyncState(This,ppAsyncState)
#define IWSDAsyncResult_Abort(This) (This)->lpVtbl->Abort(This)
#define IWSDAsyncResult_GetEvent(This,pEvent) (This)->lpVtbl->GetEvent(This,pEvent)
#define IWSDAsyncResult_GetEndpointProxy(This,ppEndpoint) (This)->lpVtbl->GetEndpointProxy(This,ppEndpoint)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWSDAsyncResult_QueryInterface(IWSDAsyncResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWSDAsyncResult_AddRef(IWSDAsyncResult* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWSDAsyncResult_Release(IWSDAsyncResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDAsyncResult methods ***/
static __WIDL_INLINE HRESULT IWSDAsyncResult_SetCallback(IWSDAsyncResult* This,IWSDAsyncCallback *pCallback,IUnknown *pAsyncState) {
    return This->lpVtbl->SetCallback(This,pCallback,pAsyncState);
}
static __WIDL_INLINE HRESULT IWSDAsyncResult_SetWaitHandle(IWSDAsyncResult* This,HANDLE hWaitHandle) {
    return This->lpVtbl->SetWaitHandle(This,hWaitHandle);
}
static __WIDL_INLINE HRESULT IWSDAsyncResult_HasCompleted(IWSDAsyncResult* This) {
    return This->lpVtbl->HasCompleted(This);
}
static __WIDL_INLINE HRESULT IWSDAsyncResult_GetAsyncState(IWSDAsyncResult* This,IUnknown **ppAsyncState) {
    return This->lpVtbl->GetAsyncState(This,ppAsyncState);
}
static __WIDL_INLINE HRESULT IWSDAsyncResult_Abort(IWSDAsyncResult* This) {
    return This->lpVtbl->Abort(This);
}
static __WIDL_INLINE HRESULT IWSDAsyncResult_GetEvent(IWSDAsyncResult* This,WSD_EVENT *pEvent) {
    return This->lpVtbl->GetEvent(This,pEvent);
}
static __WIDL_INLINE HRESULT IWSDAsyncResult_GetEndpointProxy(IWSDAsyncResult* This,IWSDEndpointProxy **ppEndpoint) {
    return This->lpVtbl->GetEndpointProxy(This,ppEndpoint);
}
#endif
#endif

#endif


#endif  /* __IWSDAsyncResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSDAsyncCallback interface
 */
#ifndef __IWSDAsyncCallback_INTERFACE_DEFINED__
#define __IWSDAsyncCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDAsyncCallback, 0xa63e109d, 0xce72, 0x49e2, 0xba,0x98, 0xe8,0x45,0xf5,0xee,0x16,0x66);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a63e109d-ce72-49e2-ba98-e845f5ee1666")
IWSDAsyncCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AsyncOperationComplete(
        IWSDAsyncResult *pAsyncResult,
        IUnknown *pAsyncState) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDAsyncCallback, 0xa63e109d, 0xce72, 0x49e2, 0xba,0x98, 0xe8,0x45,0xf5,0xee,0x16,0x66)
#endif
#else
typedef struct IWSDAsyncCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDAsyncCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDAsyncCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDAsyncCallback *This);

    /*** IWSDAsyncCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *AsyncOperationComplete)(
        IWSDAsyncCallback *This,
        IWSDAsyncResult *pAsyncResult,
        IUnknown *pAsyncState);

    END_INTERFACE
} IWSDAsyncCallbackVtbl;

interface IWSDAsyncCallback {
    CONST_VTBL IWSDAsyncCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDAsyncCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDAsyncCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDAsyncCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDAsyncCallback methods ***/
#define IWSDAsyncCallback_AsyncOperationComplete(This,pAsyncResult,pAsyncState) (This)->lpVtbl->AsyncOperationComplete(This,pAsyncResult,pAsyncState)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWSDAsyncCallback_QueryInterface(IWSDAsyncCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWSDAsyncCallback_AddRef(IWSDAsyncCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWSDAsyncCallback_Release(IWSDAsyncCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDAsyncCallback methods ***/
static __WIDL_INLINE HRESULT IWSDAsyncCallback_AsyncOperationComplete(IWSDAsyncCallback* This,IWSDAsyncResult *pAsyncResult,IUnknown *pAsyncState) {
    return This->lpVtbl->AsyncOperationComplete(This,pAsyncResult,pAsyncState);
}
#endif
#endif

#endif


#endif  /* __IWSDAsyncCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSDMetadataExchange interface
 */
#ifndef __IWSDMetadataExchange_INTERFACE_DEFINED__
#define __IWSDMetadataExchange_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDMetadataExchange, 0x06996d57, 0x1d67, 0x4928, 0x93,0x07, 0x3d,0x78,0x33,0xfd,0xb8,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("06996d57-1d67-4928-9307-3d7833fdb846")
IWSDMetadataExchange : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetMetadata(
        WSD_METADATA_SECTION_LIST **MetadataOut) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDMetadataExchange, 0x06996d57, 0x1d67, 0x4928, 0x93,0x07, 0x3d,0x78,0x33,0xfd,0xb8,0x46)
#endif
#else
typedef struct IWSDMetadataExchangeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDMetadataExchange *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDMetadataExchange *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDMetadataExchange *This);

    /*** IWSDMetadataExchange methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMetadata)(
        IWSDMetadataExchange *This,
        WSD_METADATA_SECTION_LIST **MetadataOut);

    END_INTERFACE
} IWSDMetadataExchangeVtbl;

interface IWSDMetadataExchange {
    CONST_VTBL IWSDMetadataExchangeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDMetadataExchange_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDMetadataExchange_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDMetadataExchange_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDMetadataExchange methods ***/
#define IWSDMetadataExchange_GetMetadata(This,MetadataOut) (This)->lpVtbl->GetMetadata(This,MetadataOut)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWSDMetadataExchange_QueryInterface(IWSDMetadataExchange* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWSDMetadataExchange_AddRef(IWSDMetadataExchange* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWSDMetadataExchange_Release(IWSDMetadataExchange* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDMetadataExchange methods ***/
static __WIDL_INLINE HRESULT IWSDMetadataExchange_GetMetadata(IWSDMetadataExchange* This,WSD_METADATA_SECTION_LIST **MetadataOut) {
    return This->lpVtbl->GetMetadata(This,MetadataOut);
}
#endif
#endif

#endif


#endif  /* __IWSDMetadataExchange_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSDEventingStatus interface
 */
#ifndef __IWSDEventingStatus_INTERFACE_DEFINED__
#define __IWSDEventingStatus_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDEventingStatus, 0x49b17f52, 0x637a, 0x407a, 0xae,0x99, 0xfb,0xe8,0x2a,0x4d,0x38,0xc0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("49b17f52-637a-407a-ae99-fbe82a4d38c0")
IWSDEventingStatus : public IUnknown
{
    virtual void STDMETHODCALLTYPE SubscriptionRenewed(
        LPCWSTR pszSubscriptionAction) = 0;

    virtual void STDMETHODCALLTYPE SubscriptionRenewalFailed(
        LPCWSTR pszSubscriptionAction,
        HRESULT hr) = 0;

    virtual void STDMETHODCALLTYPE SubscriptionEnded(
        LPCWSTR pszSubscriptionAction) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDEventingStatus, 0x49b17f52, 0x637a, 0x407a, 0xae,0x99, 0xfb,0xe8,0x2a,0x4d,0x38,0xc0)
#endif
#else
typedef struct IWSDEventingStatusVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDEventingStatus *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDEventingStatus *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDEventingStatus *This);

    /*** IWSDEventingStatus methods ***/
    void (STDMETHODCALLTYPE *SubscriptionRenewed)(
        IWSDEventingStatus *This,
        LPCWSTR pszSubscriptionAction);

    void (STDMETHODCALLTYPE *SubscriptionRenewalFailed)(
        IWSDEventingStatus *This,
        LPCWSTR pszSubscriptionAction,
        HRESULT hr);

    void (STDMETHODCALLTYPE *SubscriptionEnded)(
        IWSDEventingStatus *This,
        LPCWSTR pszSubscriptionAction);

    END_INTERFACE
} IWSDEventingStatusVtbl;

interface IWSDEventingStatus {
    CONST_VTBL IWSDEventingStatusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDEventingStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDEventingStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDEventingStatus_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDEventingStatus methods ***/
#define IWSDEventingStatus_SubscriptionRenewed(This,pszSubscriptionAction) (This)->lpVtbl->SubscriptionRenewed(This,pszSubscriptionAction)
#define IWSDEventingStatus_SubscriptionRenewalFailed(This,pszSubscriptionAction,hr) (This)->lpVtbl->SubscriptionRenewalFailed(This,pszSubscriptionAction,hr)
#define IWSDEventingStatus_SubscriptionEnded(This,pszSubscriptionAction) (This)->lpVtbl->SubscriptionEnded(This,pszSubscriptionAction)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWSDEventingStatus_QueryInterface(IWSDEventingStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWSDEventingStatus_AddRef(IWSDEventingStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWSDEventingStatus_Release(IWSDEventingStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDEventingStatus methods ***/
static __WIDL_INLINE void IWSDEventingStatus_SubscriptionRenewed(IWSDEventingStatus* This,LPCWSTR pszSubscriptionAction) {
    This->lpVtbl->SubscriptionRenewed(This,pszSubscriptionAction);
}
static __WIDL_INLINE void IWSDEventingStatus_SubscriptionRenewalFailed(IWSDEventingStatus* This,LPCWSTR pszSubscriptionAction,HRESULT hr) {
    This->lpVtbl->SubscriptionRenewalFailed(This,pszSubscriptionAction,hr);
}
static __WIDL_INLINE void IWSDEventingStatus_SubscriptionEnded(IWSDEventingStatus* This,LPCWSTR pszSubscriptionAction) {
    This->lpVtbl->SubscriptionEnded(This,pszSubscriptionAction);
}
#endif
#endif

#endif


#endif  /* __IWSDEventingStatus_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSDEndpointProxy interface
 */
#ifndef __IWSDEndpointProxy_INTERFACE_DEFINED__
#define __IWSDEndpointProxy_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDEndpointProxy, 0x1860d430, 0xb24c, 0x4975, 0x9f,0x90, 0xdb,0xb3,0x9b,0xaa,0x24,0xec);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1860d430-b24c-4975-9f90-dbb39baa24ec")
IWSDEndpointProxy : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SendOneWayRequest(
        const void *pBody,
        const WSD_OPERATION *pOperation) = 0;

    virtual HRESULT STDMETHODCALLTYPE SendTwoWayRequest(
        const void *pBody,
        const WSD_OPERATION *pOperation,
        const WSD_SYNCHRONOUS_RESPONSE_CONTEXT *pResponseContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE SendTwoWayRequestAsync(
        const void *pBody,
        const WSD_OPERATION *pOperation,
        IUnknown *pAsyncState,
        IWSDAsyncCallback *pCallback,
        IWSDAsyncResult **pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE AbortAsyncOperation(
        IWSDAsyncResult *pAsyncResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE ProcessFault(
        const WSD_SOAP_FAULT *pFault) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetErrorInfo(
        LPCWSTR *ppszErrorInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFaultInfo(
        WSD_SOAP_FAULT **ppFault) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDEndpointProxy, 0x1860d430, 0xb24c, 0x4975, 0x9f,0x90, 0xdb,0xb3,0x9b,0xaa,0x24,0xec)
#endif
#else
typedef struct IWSDEndpointProxyVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDEndpointProxy *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDEndpointProxy *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDEndpointProxy *This);

    /*** IWSDEndpointProxy methods ***/
    HRESULT (STDMETHODCALLTYPE *SendOneWayRequest)(
        IWSDEndpointProxy *This,
        const void *pBody,
        const WSD_OPERATION *pOperation);

    HRESULT (STDMETHODCALLTYPE *SendTwoWayRequest)(
        IWSDEndpointProxy *This,
        const void *pBody,
        const WSD_OPERATION *pOperation,
        const WSD_SYNCHRONOUS_RESPONSE_CONTEXT *pResponseContext);

    HRESULT (STDMETHODCALLTYPE *SendTwoWayRequestAsync)(
        IWSDEndpointProxy *This,
        const void *pBody,
        const WSD_OPERATION *pOperation,
        IUnknown *pAsyncState,
        IWSDAsyncCallback *pCallback,
        IWSDAsyncResult **pResult);

    HRESULT (STDMETHODCALLTYPE *AbortAsyncOperation)(
        IWSDEndpointProxy *This,
        IWSDAsyncResult *pAsyncResult);

    HRESULT (STDMETHODCALLTYPE *ProcessFault)(
        IWSDEndpointProxy *This,
        const WSD_SOAP_FAULT *pFault);

    HRESULT (STDMETHODCALLTYPE *GetErrorInfo)(
        IWSDEndpointProxy *This,
        LPCWSTR *ppszErrorInfo);

    HRESULT (STDMETHODCALLTYPE *GetFaultInfo)(
        IWSDEndpointProxy *This,
        WSD_SOAP_FAULT **ppFault);

    END_INTERFACE
} IWSDEndpointProxyVtbl;

interface IWSDEndpointProxy {
    CONST_VTBL IWSDEndpointProxyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDEndpointProxy_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDEndpointProxy_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDEndpointProxy_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDEndpointProxy methods ***/
#define IWSDEndpointProxy_SendOneWayRequest(This,pBody,pOperation) (This)->lpVtbl->SendOneWayRequest(This,pBody,pOperation)
#define IWSDEndpointProxy_SendTwoWayRequest(This,pBody,pOperation,pResponseContext) (This)->lpVtbl->SendTwoWayRequest(This,pBody,pOperation,pResponseContext)
#define IWSDEndpointProxy_SendTwoWayRequestAsync(This,pBody,pOperation,pAsyncState,pCallback,pResult) (This)->lpVtbl->SendTwoWayRequestAsync(This,pBody,pOperation,pAsyncState,pCallback,pResult)
#define IWSDEndpointProxy_AbortAsyncOperation(This,pAsyncResult) (This)->lpVtbl->AbortAsyncOperation(This,pAsyncResult)
#define IWSDEndpointProxy_ProcessFault(This,pFault) (This)->lpVtbl->ProcessFault(This,pFault)
#define IWSDEndpointProxy_GetErrorInfo(This,ppszErrorInfo) (This)->lpVtbl->GetErrorInfo(This,ppszErrorInfo)
#define IWSDEndpointProxy_GetFaultInfo(This,ppFault) (This)->lpVtbl->GetFaultInfo(This,ppFault)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWSDEndpointProxy_QueryInterface(IWSDEndpointProxy* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWSDEndpointProxy_AddRef(IWSDEndpointProxy* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWSDEndpointProxy_Release(IWSDEndpointProxy* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDEndpointProxy methods ***/
static __WIDL_INLINE HRESULT IWSDEndpointProxy_SendOneWayRequest(IWSDEndpointProxy* This,const void *pBody,const WSD_OPERATION *pOperation) {
    return This->lpVtbl->SendOneWayRequest(This,pBody,pOperation);
}
static __WIDL_INLINE HRESULT IWSDEndpointProxy_SendTwoWayRequest(IWSDEndpointProxy* This,const void *pBody,const WSD_OPERATION *pOperation,const WSD_SYNCHRONOUS_RESPONSE_CONTEXT *pResponseContext) {
    return This->lpVtbl->SendTwoWayRequest(This,pBody,pOperation,pResponseContext);
}
static __WIDL_INLINE HRESULT IWSDEndpointProxy_SendTwoWayRequestAsync(IWSDEndpointProxy* This,const void *pBody,const WSD_OPERATION *pOperation,IUnknown *pAsyncState,IWSDAsyncCallback *pCallback,IWSDAsyncResult **pResult) {
    return This->lpVtbl->SendTwoWayRequestAsync(This,pBody,pOperation,pAsyncState,pCallback,pResult);
}
static __WIDL_INLINE HRESULT IWSDEndpointProxy_AbortAsyncOperation(IWSDEndpointProxy* This,IWSDAsyncResult *pAsyncResult) {
    return This->lpVtbl->AbortAsyncOperation(This,pAsyncResult);
}
static __WIDL_INLINE HRESULT IWSDEndpointProxy_ProcessFault(IWSDEndpointProxy* This,const WSD_SOAP_FAULT *pFault) {
    return This->lpVtbl->ProcessFault(This,pFault);
}
static __WIDL_INLINE HRESULT IWSDEndpointProxy_GetErrorInfo(IWSDEndpointProxy* This,LPCWSTR *ppszErrorInfo) {
    return This->lpVtbl->GetErrorInfo(This,ppszErrorInfo);
}
static __WIDL_INLINE HRESULT IWSDEndpointProxy_GetFaultInfo(IWSDEndpointProxy* This,WSD_SOAP_FAULT **ppFault) {
    return This->lpVtbl->GetFaultInfo(This,ppFault);
}
#endif
#endif

#endif


#endif  /* __IWSDEndpointProxy_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSDDeviceProxy interface
 */
#ifndef __IWSDDeviceProxy_INTERFACE_DEFINED__
#define __IWSDDeviceProxy_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDDeviceProxy, 0xeee0c031, 0xc578, 0x4c0e, 0x9a,0x3b, 0x97,0x3c,0x35,0xf4,0x09,0xdb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("eee0c031-c578-4c0e-9a3b-973c35f409db")
IWSDDeviceProxy : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Init(
        LPCWSTR pszDeviceId,
        IWSDAddress *pDeviceAddress,
        LPCWSTR pszLocalId,
        IWSDXMLContext *pContext,
        IWSDDeviceProxy *pSponsor) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginGetMetadata(
        IWSDAsyncResult **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndGetMetadata(
        IWSDAsyncResult *pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetHostMetadata(
        WSD_HOST_METADATA **ppHostMetadata) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetThisModelMetadata(
        WSD_THIS_MODEL_METADATA **ppManufacturerMetadata) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetThisDeviceMetadata(
        WSD_THIS_DEVICE_METADATA **ppThisDeviceMetadata) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAllMetadata(
        WSD_METADATA_SECTION_LIST **ppMetadata) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetServiceProxyById(
        LPCWSTR pszServiceId,
        IWSDServiceProxy **ppServiceProxy) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetServiceProxyByType(
        const WSDXML_NAME *pType,
        IWSDServiceProxy **ppServiceProxy) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEndpointProxy(
        IWSDEndpointProxy **ppProxy) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDDeviceProxy, 0xeee0c031, 0xc578, 0x4c0e, 0x9a,0x3b, 0x97,0x3c,0x35,0xf4,0x09,0xdb)
#endif
#else
typedef struct IWSDDeviceProxyVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDDeviceProxy *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDDeviceProxy *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDDeviceProxy *This);

    /*** IWSDDeviceProxy methods ***/
    HRESULT (STDMETHODCALLTYPE *Init)(
        IWSDDeviceProxy *This,
        LPCWSTR pszDeviceId,
        IWSDAddress *pDeviceAddress,
        LPCWSTR pszLocalId,
        IWSDXMLContext *pContext,
        IWSDDeviceProxy *pSponsor);

    HRESULT (STDMETHODCALLTYPE *BeginGetMetadata)(
        IWSDDeviceProxy *This,
        IWSDAsyncResult **ppResult);

    HRESULT (STDMETHODCALLTYPE *EndGetMetadata)(
        IWSDDeviceProxy *This,
        IWSDAsyncResult *pResult);

    HRESULT (STDMETHODCALLTYPE *GetHostMetadata)(
        IWSDDeviceProxy *This,
        WSD_HOST_METADATA **ppHostMetadata);

    HRESULT (STDMETHODCALLTYPE *GetThisModelMetadata)(
        IWSDDeviceProxy *This,
        WSD_THIS_MODEL_METADATA **ppManufacturerMetadata);

    HRESULT (STDMETHODCALLTYPE *GetThisDeviceMetadata)(
        IWSDDeviceProxy *This,
        WSD_THIS_DEVICE_METADATA **ppThisDeviceMetadata);

    HRESULT (STDMETHODCALLTYPE *GetAllMetadata)(
        IWSDDeviceProxy *This,
        WSD_METADATA_SECTION_LIST **ppMetadata);

    HRESULT (STDMETHODCALLTYPE *GetServiceProxyById)(
        IWSDDeviceProxy *This,
        LPCWSTR pszServiceId,
        IWSDServiceProxy **ppServiceProxy);

    HRESULT (STDMETHODCALLTYPE *GetServiceProxyByType)(
        IWSDDeviceProxy *This,
        const WSDXML_NAME *pType,
        IWSDServiceProxy **ppServiceProxy);

    HRESULT (STDMETHODCALLTYPE *GetEndpointProxy)(
        IWSDDeviceProxy *This,
        IWSDEndpointProxy **ppProxy);

    END_INTERFACE
} IWSDDeviceProxyVtbl;

interface IWSDDeviceProxy {
    CONST_VTBL IWSDDeviceProxyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDDeviceProxy_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDDeviceProxy_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDDeviceProxy_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDDeviceProxy methods ***/
#define IWSDDeviceProxy_Init(This,pszDeviceId,pDeviceAddress,pszLocalId,pContext,pSponsor) (This)->lpVtbl->Init(This,pszDeviceId,pDeviceAddress,pszLocalId,pContext,pSponsor)
#define IWSDDeviceProxy_BeginGetMetadata(This,ppResult) (This)->lpVtbl->BeginGetMetadata(This,ppResult)
#define IWSDDeviceProxy_EndGetMetadata(This,pResult) (This)->lpVtbl->EndGetMetadata(This,pResult)
#define IWSDDeviceProxy_GetHostMetadata(This,ppHostMetadata) (This)->lpVtbl->GetHostMetadata(This,ppHostMetadata)
#define IWSDDeviceProxy_GetThisModelMetadata(This,ppManufacturerMetadata) (This)->lpVtbl->GetThisModelMetadata(This,ppManufacturerMetadata)
#define IWSDDeviceProxy_GetThisDeviceMetadata(This,ppThisDeviceMetadata) (This)->lpVtbl->GetThisDeviceMetadata(This,ppThisDeviceMetadata)
#define IWSDDeviceProxy_GetAllMetadata(This,ppMetadata) (This)->lpVtbl->GetAllMetadata(This,ppMetadata)
#define IWSDDeviceProxy_GetServiceProxyById(This,pszServiceId,ppServiceProxy) (This)->lpVtbl->GetServiceProxyById(This,pszServiceId,ppServiceProxy)
#define IWSDDeviceProxy_GetServiceProxyByType(This,pType,ppServiceProxy) (This)->lpVtbl->GetServiceProxyByType(This,pType,ppServiceProxy)
#define IWSDDeviceProxy_GetEndpointProxy(This,ppProxy) (This)->lpVtbl->GetEndpointProxy(This,ppProxy)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWSDDeviceProxy_QueryInterface(IWSDDeviceProxy* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWSDDeviceProxy_AddRef(IWSDDeviceProxy* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWSDDeviceProxy_Release(IWSDDeviceProxy* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDDeviceProxy methods ***/
static __WIDL_INLINE HRESULT IWSDDeviceProxy_Init(IWSDDeviceProxy* This,LPCWSTR pszDeviceId,IWSDAddress *pDeviceAddress,LPCWSTR pszLocalId,IWSDXMLContext *pContext,IWSDDeviceProxy *pSponsor) {
    return This->lpVtbl->Init(This,pszDeviceId,pDeviceAddress,pszLocalId,pContext,pSponsor);
}
static __WIDL_INLINE HRESULT IWSDDeviceProxy_BeginGetMetadata(IWSDDeviceProxy* This,IWSDAsyncResult **ppResult) {
    return This->lpVtbl->BeginGetMetadata(This,ppResult);
}
static __WIDL_INLINE HRESULT IWSDDeviceProxy_EndGetMetadata(IWSDDeviceProxy* This,IWSDAsyncResult *pResult) {
    return This->lpVtbl->EndGetMetadata(This,pResult);
}
static __WIDL_INLINE HRESULT IWSDDeviceProxy_GetHostMetadata(IWSDDeviceProxy* This,WSD_HOST_METADATA **ppHostMetadata) {
    return This->lpVtbl->GetHostMetadata(This,ppHostMetadata);
}
static __WIDL_INLINE HRESULT IWSDDeviceProxy_GetThisModelMetadata(IWSDDeviceProxy* This,WSD_THIS_MODEL_METADATA **ppManufacturerMetadata) {
    return This->lpVtbl->GetThisModelMetadata(This,ppManufacturerMetadata);
}
static __WIDL_INLINE HRESULT IWSDDeviceProxy_GetThisDeviceMetadata(IWSDDeviceProxy* This,WSD_THIS_DEVICE_METADATA **ppThisDeviceMetadata) {
    return This->lpVtbl->GetThisDeviceMetadata(This,ppThisDeviceMetadata);
}
static __WIDL_INLINE HRESULT IWSDDeviceProxy_GetAllMetadata(IWSDDeviceProxy* This,WSD_METADATA_SECTION_LIST **ppMetadata) {
    return This->lpVtbl->GetAllMetadata(This,ppMetadata);
}
static __WIDL_INLINE HRESULT IWSDDeviceProxy_GetServiceProxyById(IWSDDeviceProxy* This,LPCWSTR pszServiceId,IWSDServiceProxy **ppServiceProxy) {
    return This->lpVtbl->GetServiceProxyById(This,pszServiceId,ppServiceProxy);
}
static __WIDL_INLINE HRESULT IWSDDeviceProxy_GetServiceProxyByType(IWSDDeviceProxy* This,const WSDXML_NAME *pType,IWSDServiceProxy **ppServiceProxy) {
    return This->lpVtbl->GetServiceProxyByType(This,pType,ppServiceProxy);
}
static __WIDL_INLINE HRESULT IWSDDeviceProxy_GetEndpointProxy(IWSDDeviceProxy* This,IWSDEndpointProxy **ppProxy) {
    return This->lpVtbl->GetEndpointProxy(This,ppProxy);
}
#endif
#endif

#endif


#endif  /* __IWSDDeviceProxy_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSDServiceProxy interface
 */
#ifndef __IWSDServiceProxy_INTERFACE_DEFINED__
#define __IWSDServiceProxy_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDServiceProxy, 0xd4c7fb9c, 0x03ab, 0x4175, 0x9d,0x67, 0x09,0x4f,0xaf,0xeb,0xf4,0x87);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d4c7fb9c-03ab-4175-9d67-094fafebf487")
IWSDServiceProxy : public IWSDMetadataExchange
{
    virtual HRESULT STDMETHODCALLTYPE BeginGetMetadata(
        IWSDAsyncResult **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndGetMetadata(
        IWSDAsyncResult *pResult,
        WSD_METADATA_SECTION_LIST **ppMetadata) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetServiceMetadata(
        WSD_SERVICE_METADATA **ppServiceMetadata) = 0;

    virtual HRESULT STDMETHODCALLTYPE SubscribeToOperation(
        const WSD_OPERATION *pOperation,
        IUnknown *pUnknown,
        const WSDXML_ELEMENT *pAny,
        WSDXML_ELEMENT **ppAny) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnsubscribeToOperation(
        const WSD_OPERATION *pOperation) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEventingStatusCallback(
        IWSDEventingStatus *pStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEndpointProxy(
        IWSDEndpointProxy **ppProxy) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDServiceProxy, 0xd4c7fb9c, 0x03ab, 0x4175, 0x9d,0x67, 0x09,0x4f,0xaf,0xeb,0xf4,0x87)
#endif
#else
typedef struct IWSDServiceProxyVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDServiceProxy *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDServiceProxy *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDServiceProxy *This);

    /*** IWSDMetadataExchange methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMetadata)(
        IWSDServiceProxy *This,
        WSD_METADATA_SECTION_LIST **MetadataOut);

    /*** IWSDServiceProxy methods ***/
    HRESULT (STDMETHODCALLTYPE *BeginGetMetadata)(
        IWSDServiceProxy *This,
        IWSDAsyncResult **ppResult);

    HRESULT (STDMETHODCALLTYPE *EndGetMetadata)(
        IWSDServiceProxy *This,
        IWSDAsyncResult *pResult,
        WSD_METADATA_SECTION_LIST **ppMetadata);

    HRESULT (STDMETHODCALLTYPE *GetServiceMetadata)(
        IWSDServiceProxy *This,
        WSD_SERVICE_METADATA **ppServiceMetadata);

    HRESULT (STDMETHODCALLTYPE *SubscribeToOperation)(
        IWSDServiceProxy *This,
        const WSD_OPERATION *pOperation,
        IUnknown *pUnknown,
        const WSDXML_ELEMENT *pAny,
        WSDXML_ELEMENT **ppAny);

    HRESULT (STDMETHODCALLTYPE *UnsubscribeToOperation)(
        IWSDServiceProxy *This,
        const WSD_OPERATION *pOperation);

    HRESULT (STDMETHODCALLTYPE *SetEventingStatusCallback)(
        IWSDServiceProxy *This,
        IWSDEventingStatus *pStatus);

    HRESULT (STDMETHODCALLTYPE *GetEndpointProxy)(
        IWSDServiceProxy *This,
        IWSDEndpointProxy **ppProxy);

    END_INTERFACE
} IWSDServiceProxyVtbl;

interface IWSDServiceProxy {
    CONST_VTBL IWSDServiceProxyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDServiceProxy_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDServiceProxy_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDServiceProxy_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDMetadataExchange methods ***/
#define IWSDServiceProxy_GetMetadata(This,MetadataOut) (This)->lpVtbl->GetMetadata(This,MetadataOut)
/*** IWSDServiceProxy methods ***/
#define IWSDServiceProxy_BeginGetMetadata(This,ppResult) (This)->lpVtbl->BeginGetMetadata(This,ppResult)
#define IWSDServiceProxy_EndGetMetadata(This,pResult,ppMetadata) (This)->lpVtbl->EndGetMetadata(This,pResult,ppMetadata)
#define IWSDServiceProxy_GetServiceMetadata(This,ppServiceMetadata) (This)->lpVtbl->GetServiceMetadata(This,ppServiceMetadata)
#define IWSDServiceProxy_SubscribeToOperation(This,pOperation,pUnknown,pAny,ppAny) (This)->lpVtbl->SubscribeToOperation(This,pOperation,pUnknown,pAny,ppAny)
#define IWSDServiceProxy_UnsubscribeToOperation(This,pOperation) (This)->lpVtbl->UnsubscribeToOperation(This,pOperation)
#define IWSDServiceProxy_SetEventingStatusCallback(This,pStatus) (This)->lpVtbl->SetEventingStatusCallback(This,pStatus)
#define IWSDServiceProxy_GetEndpointProxy(This,ppProxy) (This)->lpVtbl->GetEndpointProxy(This,ppProxy)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWSDServiceProxy_QueryInterface(IWSDServiceProxy* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWSDServiceProxy_AddRef(IWSDServiceProxy* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWSDServiceProxy_Release(IWSDServiceProxy* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDMetadataExchange methods ***/
static __WIDL_INLINE HRESULT IWSDServiceProxy_GetMetadata(IWSDServiceProxy* This,WSD_METADATA_SECTION_LIST **MetadataOut) {
    return This->lpVtbl->GetMetadata(This,MetadataOut);
}
/*** IWSDServiceProxy methods ***/
static __WIDL_INLINE HRESULT IWSDServiceProxy_BeginGetMetadata(IWSDServiceProxy* This,IWSDAsyncResult **ppResult) {
    return This->lpVtbl->BeginGetMetadata(This,ppResult);
}
static __WIDL_INLINE HRESULT IWSDServiceProxy_EndGetMetadata(IWSDServiceProxy* This,IWSDAsyncResult *pResult,WSD_METADATA_SECTION_LIST **ppMetadata) {
    return This->lpVtbl->EndGetMetadata(This,pResult,ppMetadata);
}
static __WIDL_INLINE HRESULT IWSDServiceProxy_GetServiceMetadata(IWSDServiceProxy* This,WSD_SERVICE_METADATA **ppServiceMetadata) {
    return This->lpVtbl->GetServiceMetadata(This,ppServiceMetadata);
}
static __WIDL_INLINE HRESULT IWSDServiceProxy_SubscribeToOperation(IWSDServiceProxy* This,const WSD_OPERATION *pOperation,IUnknown *pUnknown,const WSDXML_ELEMENT *pAny,WSDXML_ELEMENT **ppAny) {
    return This->lpVtbl->SubscribeToOperation(This,pOperation,pUnknown,pAny,ppAny);
}
static __WIDL_INLINE HRESULT IWSDServiceProxy_UnsubscribeToOperation(IWSDServiceProxy* This,const WSD_OPERATION *pOperation) {
    return This->lpVtbl->UnsubscribeToOperation(This,pOperation);
}
static __WIDL_INLINE HRESULT IWSDServiceProxy_SetEventingStatusCallback(IWSDServiceProxy* This,IWSDEventingStatus *pStatus) {
    return This->lpVtbl->SetEventingStatusCallback(This,pStatus);
}
static __WIDL_INLINE HRESULT IWSDServiceProxy_GetEndpointProxy(IWSDServiceProxy* This,IWSDEndpointProxy **ppProxy) {
    return This->lpVtbl->GetEndpointProxy(This,ppProxy);
}
#endif
#endif

#endif


#endif  /* __IWSDServiceProxy_INTERFACE_DEFINED__ */

#if WINVER >= 0x601
/*****************************************************************************
 * IWSDServiceProxyEventing interface
 */
#ifndef __IWSDServiceProxyEventing_INTERFACE_DEFINED__
#define __IWSDServiceProxyEventing_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDServiceProxyEventing, 0xf9279d6d, 0x1012, 0x4a94, 0xb8,0xcc, 0xfd,0x35,0xd2,0x20,0x2b,0xfe);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f9279d6d-1012-4a94-b8cc-fd35d2202bfe")
IWSDServiceProxyEventing : public IWSDServiceProxy
{
    virtual HRESULT STDMETHODCALLTYPE SubscribeToMultipleOperations(
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        IUnknown *pUnknown,
        const WSD_EVENTING_EXPIRES *pExpires,
        const WSDXML_ELEMENT *pAny,
        WSD_EVENTING_EXPIRES **ppExpires,
        WSDXML_ELEMENT **ppAny) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginSubscribeToMultipleOperations(
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        IUnknown *pUnknown,
        const WSD_EVENTING_EXPIRES *pExpires,
        const WSDXML_ELEMENT *pAny,
        IUnknown *pAsyncState,
        IWSDAsyncCallback *pAsyncCallback,
        IWSDAsyncResult **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndSubscribeToMultipleOperations(
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        IWSDAsyncResult *pResult,
        WSD_EVENTING_EXPIRES **ppExpires,
        WSDXML_ELEMENT **ppAny) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnsubscribeToMultipleOperations(
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        const WSDXML_ELEMENT *pAny) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginUnsubscribeToMultipleOperations(
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        const WSDXML_ELEMENT *pAny,
        IUnknown *pAsyncState,
        IWSDAsyncCallback *pAsyncCallback,
        IWSDAsyncResult **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndUnsubscribeToMultipleOperations(
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        IWSDAsyncResult *pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE RenewMultipleOperations(
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        const WSD_EVENTING_EXPIRES *pExpires,
        const WSDXML_ELEMENT *pAny,
        WSD_EVENTING_EXPIRES **ppExpires,
        WSDXML_ELEMENT **ppAny) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginRenewMultipleOperations(
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        const WSD_EVENTING_EXPIRES *pExpires,
        const WSDXML_ELEMENT *pAny,
        IUnknown *pAsyncState,
        IWSDAsyncCallback *pAsyncCallback,
        IWSDAsyncResult **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndRenewMultipleOperations(
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        IWSDAsyncResult *pResult,
        WSD_EVENTING_EXPIRES **ppExpires,
        WSDXML_ELEMENT **ppAny) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStatusForMultipleOperations(
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        const WSDXML_ELEMENT *pAny,
        WSD_EVENTING_EXPIRES **ppExpires,
        WSDXML_ELEMENT **ppAny) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginGetStatusForMultipleOperations(
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        const WSDXML_ELEMENT *pAny,
        IUnknown *pAsyncState,
        IWSDAsyncCallback *pAsyncCallback,
        IWSDAsyncResult **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndGetStatusForMultipleOperations(
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        IWSDAsyncResult *pResult,
        WSD_EVENTING_EXPIRES **ppExpires,
        WSDXML_ELEMENT **ppAny) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDServiceProxyEventing, 0xf9279d6d, 0x1012, 0x4a94, 0xb8,0xcc, 0xfd,0x35,0xd2,0x20,0x2b,0xfe)
#endif
#else
typedef struct IWSDServiceProxyEventingVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDServiceProxyEventing *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDServiceProxyEventing *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDServiceProxyEventing *This);

    /*** IWSDMetadataExchange methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMetadata)(
        IWSDServiceProxyEventing *This,
        WSD_METADATA_SECTION_LIST **MetadataOut);

    /*** IWSDServiceProxy methods ***/
    HRESULT (STDMETHODCALLTYPE *BeginGetMetadata)(
        IWSDServiceProxyEventing *This,
        IWSDAsyncResult **ppResult);

    HRESULT (STDMETHODCALLTYPE *EndGetMetadata)(
        IWSDServiceProxyEventing *This,
        IWSDAsyncResult *pResult,
        WSD_METADATA_SECTION_LIST **ppMetadata);

    HRESULT (STDMETHODCALLTYPE *GetServiceMetadata)(
        IWSDServiceProxyEventing *This,
        WSD_SERVICE_METADATA **ppServiceMetadata);

    HRESULT (STDMETHODCALLTYPE *SubscribeToOperation)(
        IWSDServiceProxyEventing *This,
        const WSD_OPERATION *pOperation,
        IUnknown *pUnknown,
        const WSDXML_ELEMENT *pAny,
        WSDXML_ELEMENT **ppAny);

    HRESULT (STDMETHODCALLTYPE *UnsubscribeToOperation)(
        IWSDServiceProxyEventing *This,
        const WSD_OPERATION *pOperation);

    HRESULT (STDMETHODCALLTYPE *SetEventingStatusCallback)(
        IWSDServiceProxyEventing *This,
        IWSDEventingStatus *pStatus);

    HRESULT (STDMETHODCALLTYPE *GetEndpointProxy)(
        IWSDServiceProxyEventing *This,
        IWSDEndpointProxy **ppProxy);

    /*** IWSDServiceProxyEventing methods ***/
    HRESULT (STDMETHODCALLTYPE *SubscribeToMultipleOperations)(
        IWSDServiceProxyEventing *This,
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        IUnknown *pUnknown,
        const WSD_EVENTING_EXPIRES *pExpires,
        const WSDXML_ELEMENT *pAny,
        WSD_EVENTING_EXPIRES **ppExpires,
        WSDXML_ELEMENT **ppAny);

    HRESULT (STDMETHODCALLTYPE *BeginSubscribeToMultipleOperations)(
        IWSDServiceProxyEventing *This,
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        IUnknown *pUnknown,
        const WSD_EVENTING_EXPIRES *pExpires,
        const WSDXML_ELEMENT *pAny,
        IUnknown *pAsyncState,
        IWSDAsyncCallback *pAsyncCallback,
        IWSDAsyncResult **ppResult);

    HRESULT (STDMETHODCALLTYPE *EndSubscribeToMultipleOperations)(
        IWSDServiceProxyEventing *This,
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        IWSDAsyncResult *pResult,
        WSD_EVENTING_EXPIRES **ppExpires,
        WSDXML_ELEMENT **ppAny);

    HRESULT (STDMETHODCALLTYPE *UnsubscribeToMultipleOperations)(
        IWSDServiceProxyEventing *This,
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        const WSDXML_ELEMENT *pAny);

    HRESULT (STDMETHODCALLTYPE *BeginUnsubscribeToMultipleOperations)(
        IWSDServiceProxyEventing *This,
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        const WSDXML_ELEMENT *pAny,
        IUnknown *pAsyncState,
        IWSDAsyncCallback *pAsyncCallback,
        IWSDAsyncResult **ppResult);

    HRESULT (STDMETHODCALLTYPE *EndUnsubscribeToMultipleOperations)(
        IWSDServiceProxyEventing *This,
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        IWSDAsyncResult *pResult);

    HRESULT (STDMETHODCALLTYPE *RenewMultipleOperations)(
        IWSDServiceProxyEventing *This,
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        const WSD_EVENTING_EXPIRES *pExpires,
        const WSDXML_ELEMENT *pAny,
        WSD_EVENTING_EXPIRES **ppExpires,
        WSDXML_ELEMENT **ppAny);

    HRESULT (STDMETHODCALLTYPE *BeginRenewMultipleOperations)(
        IWSDServiceProxyEventing *This,
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        const WSD_EVENTING_EXPIRES *pExpires,
        const WSDXML_ELEMENT *pAny,
        IUnknown *pAsyncState,
        IWSDAsyncCallback *pAsyncCallback,
        IWSDAsyncResult **ppResult);

    HRESULT (STDMETHODCALLTYPE *EndRenewMultipleOperations)(
        IWSDServiceProxyEventing *This,
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        IWSDAsyncResult *pResult,
        WSD_EVENTING_EXPIRES **ppExpires,
        WSDXML_ELEMENT **ppAny);

    HRESULT (STDMETHODCALLTYPE *GetStatusForMultipleOperations)(
        IWSDServiceProxyEventing *This,
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        const WSDXML_ELEMENT *pAny,
        WSD_EVENTING_EXPIRES **ppExpires,
        WSDXML_ELEMENT **ppAny);

    HRESULT (STDMETHODCALLTYPE *BeginGetStatusForMultipleOperations)(
        IWSDServiceProxyEventing *This,
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        const WSDXML_ELEMENT *pAny,
        IUnknown *pAsyncState,
        IWSDAsyncCallback *pAsyncCallback,
        IWSDAsyncResult **ppResult);

    HRESULT (STDMETHODCALLTYPE *EndGetStatusForMultipleOperations)(
        IWSDServiceProxyEventing *This,
        const WSD_OPERATION *pOperations,
        DWORD dwOperationCount,
        IWSDAsyncResult *pResult,
        WSD_EVENTING_EXPIRES **ppExpires,
        WSDXML_ELEMENT **ppAny);

    END_INTERFACE
} IWSDServiceProxyEventingVtbl;

interface IWSDServiceProxyEventing {
    CONST_VTBL IWSDServiceProxyEventingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDServiceProxyEventing_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDServiceProxyEventing_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDServiceProxyEventing_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDMetadataExchange methods ***/
#define IWSDServiceProxyEventing_GetMetadata(This,MetadataOut) (This)->lpVtbl->GetMetadata(This,MetadataOut)
/*** IWSDServiceProxy methods ***/
#define IWSDServiceProxyEventing_BeginGetMetadata(This,ppResult) (This)->lpVtbl->BeginGetMetadata(This,ppResult)
#define IWSDServiceProxyEventing_EndGetMetadata(This,pResult,ppMetadata) (This)->lpVtbl->EndGetMetadata(This,pResult,ppMetadata)
#define IWSDServiceProxyEventing_GetServiceMetadata(This,ppServiceMetadata) (This)->lpVtbl->GetServiceMetadata(This,ppServiceMetadata)
#define IWSDServiceProxyEventing_SubscribeToOperation(This,pOperation,pUnknown,pAny,ppAny) (This)->lpVtbl->SubscribeToOperation(This,pOperation,pUnknown,pAny,ppAny)
#define IWSDServiceProxyEventing_UnsubscribeToOperation(This,pOperation) (This)->lpVtbl->UnsubscribeToOperation(This,pOperation)
#define IWSDServiceProxyEventing_SetEventingStatusCallback(This,pStatus) (This)->lpVtbl->SetEventingStatusCallback(This,pStatus)
#define IWSDServiceProxyEventing_GetEndpointProxy(This,ppProxy) (This)->lpVtbl->GetEndpointProxy(This,ppProxy)
/*** IWSDServiceProxyEventing methods ***/
#define IWSDServiceProxyEventing_SubscribeToMultipleOperations(This,pOperations,dwOperationCount,pUnknown,pExpires,pAny,ppExpires,ppAny) (This)->lpVtbl->SubscribeToMultipleOperations(This,pOperations,dwOperationCount,pUnknown,pExpires,pAny,ppExpires,ppAny)
#define IWSDServiceProxyEventing_BeginSubscribeToMultipleOperations(This,pOperations,dwOperationCount,pUnknown,pExpires,pAny,pAsyncState,pAsyncCallback,ppResult) (This)->lpVtbl->BeginSubscribeToMultipleOperations(This,pOperations,dwOperationCount,pUnknown,pExpires,pAny,pAsyncState,pAsyncCallback,ppResult)
#define IWSDServiceProxyEventing_EndSubscribeToMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny) (This)->lpVtbl->EndSubscribeToMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny)
#define IWSDServiceProxyEventing_UnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pAny) (This)->lpVtbl->UnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pAny)
#define IWSDServiceProxyEventing_BeginUnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pAny,pAsyncState,pAsyncCallback,ppResult) (This)->lpVtbl->BeginUnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pAny,pAsyncState,pAsyncCallback,ppResult)
#define IWSDServiceProxyEventing_EndUnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pResult) (This)->lpVtbl->EndUnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pResult)
#define IWSDServiceProxyEventing_RenewMultipleOperations(This,pOperations,dwOperationCount,pExpires,pAny,ppExpires,ppAny) (This)->lpVtbl->RenewMultipleOperations(This,pOperations,dwOperationCount,pExpires,pAny,ppExpires,ppAny)
#define IWSDServiceProxyEventing_BeginRenewMultipleOperations(This,pOperations,dwOperationCount,pExpires,pAny,pAsyncState,pAsyncCallback,ppResult) (This)->lpVtbl->BeginRenewMultipleOperations(This,pOperations,dwOperationCount,pExpires,pAny,pAsyncState,pAsyncCallback,ppResult)
#define IWSDServiceProxyEventing_EndRenewMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny) (This)->lpVtbl->EndRenewMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny)
#define IWSDServiceProxyEventing_GetStatusForMultipleOperations(This,pOperations,dwOperationCount,pAny,ppExpires,ppAny) (This)->lpVtbl->GetStatusForMultipleOperations(This,pOperations,dwOperationCount,pAny,ppExpires,ppAny)
#define IWSDServiceProxyEventing_BeginGetStatusForMultipleOperations(This,pOperations,dwOperationCount,pAny,pAsyncState,pAsyncCallback,ppResult) (This)->lpVtbl->BeginGetStatusForMultipleOperations(This,pOperations,dwOperationCount,pAny,pAsyncState,pAsyncCallback,ppResult)
#define IWSDServiceProxyEventing_EndGetStatusForMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny) (This)->lpVtbl->EndGetStatusForMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_QueryInterface(IWSDServiceProxyEventing* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWSDServiceProxyEventing_AddRef(IWSDServiceProxyEventing* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWSDServiceProxyEventing_Release(IWSDServiceProxyEventing* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDMetadataExchange methods ***/
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_GetMetadata(IWSDServiceProxyEventing* This,WSD_METADATA_SECTION_LIST **MetadataOut) {
    return This->lpVtbl->GetMetadata(This,MetadataOut);
}
/*** IWSDServiceProxy methods ***/
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_BeginGetMetadata(IWSDServiceProxyEventing* This,IWSDAsyncResult **ppResult) {
    return This->lpVtbl->BeginGetMetadata(This,ppResult);
}
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_EndGetMetadata(IWSDServiceProxyEventing* This,IWSDAsyncResult *pResult,WSD_METADATA_SECTION_LIST **ppMetadata) {
    return This->lpVtbl->EndGetMetadata(This,pResult,ppMetadata);
}
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_GetServiceMetadata(IWSDServiceProxyEventing* This,WSD_SERVICE_METADATA **ppServiceMetadata) {
    return This->lpVtbl->GetServiceMetadata(This,ppServiceMetadata);
}
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_SubscribeToOperation(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperation,IUnknown *pUnknown,const WSDXML_ELEMENT *pAny,WSDXML_ELEMENT **ppAny) {
    return This->lpVtbl->SubscribeToOperation(This,pOperation,pUnknown,pAny,ppAny);
}
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_UnsubscribeToOperation(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperation) {
    return This->lpVtbl->UnsubscribeToOperation(This,pOperation);
}
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_SetEventingStatusCallback(IWSDServiceProxyEventing* This,IWSDEventingStatus *pStatus) {
    return This->lpVtbl->SetEventingStatusCallback(This,pStatus);
}
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_GetEndpointProxy(IWSDServiceProxyEventing* This,IWSDEndpointProxy **ppProxy) {
    return This->lpVtbl->GetEndpointProxy(This,ppProxy);
}
/*** IWSDServiceProxyEventing methods ***/
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_SubscribeToMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,IUnknown *pUnknown,const WSD_EVENTING_EXPIRES *pExpires,const WSDXML_ELEMENT *pAny,WSD_EVENTING_EXPIRES **ppExpires,WSDXML_ELEMENT **ppAny) {
    return This->lpVtbl->SubscribeToMultipleOperations(This,pOperations,dwOperationCount,pUnknown,pExpires,pAny,ppExpires,ppAny);
}
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_BeginSubscribeToMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,IUnknown *pUnknown,const WSD_EVENTING_EXPIRES *pExpires,const WSDXML_ELEMENT *pAny,IUnknown *pAsyncState,IWSDAsyncCallback *pAsyncCallback,IWSDAsyncResult **ppResult) {
    return This->lpVtbl->BeginSubscribeToMultipleOperations(This,pOperations,dwOperationCount,pUnknown,pExpires,pAny,pAsyncState,pAsyncCallback,ppResult);
}
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_EndSubscribeToMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,IWSDAsyncResult *pResult,WSD_EVENTING_EXPIRES **ppExpires,WSDXML_ELEMENT **ppAny) {
    return This->lpVtbl->EndSubscribeToMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny);
}
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_UnsubscribeToMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,const WSDXML_ELEMENT *pAny) {
    return This->lpVtbl->UnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pAny);
}
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_BeginUnsubscribeToMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,const WSDXML_ELEMENT *pAny,IUnknown *pAsyncState,IWSDAsyncCallback *pAsyncCallback,IWSDAsyncResult **ppResult) {
    return This->lpVtbl->BeginUnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pAny,pAsyncState,pAsyncCallback,ppResult);
}
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_EndUnsubscribeToMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,IWSDAsyncResult *pResult) {
    return This->lpVtbl->EndUnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pResult);
}
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_RenewMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,const WSD_EVENTING_EXPIRES *pExpires,const WSDXML_ELEMENT *pAny,WSD_EVENTING_EXPIRES **ppExpires,WSDXML_ELEMENT **ppAny) {
    return This->lpVtbl->RenewMultipleOperations(This,pOperations,dwOperationCount,pExpires,pAny,ppExpires,ppAny);
}
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_BeginRenewMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,const WSD_EVENTING_EXPIRES *pExpires,const WSDXML_ELEMENT *pAny,IUnknown *pAsyncState,IWSDAsyncCallback *pAsyncCallback,IWSDAsyncResult **ppResult) {
    return This->lpVtbl->BeginRenewMultipleOperations(This,pOperations,dwOperationCount,pExpires,pAny,pAsyncState,pAsyncCallback,ppResult);
}
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_EndRenewMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,IWSDAsyncResult *pResult,WSD_EVENTING_EXPIRES **ppExpires,WSDXML_ELEMENT **ppAny) {
    return This->lpVtbl->EndRenewMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny);
}
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_GetStatusForMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,const WSDXML_ELEMENT *pAny,WSD_EVENTING_EXPIRES **ppExpires,WSDXML_ELEMENT **ppAny) {
    return This->lpVtbl->GetStatusForMultipleOperations(This,pOperations,dwOperationCount,pAny,ppExpires,ppAny);
}
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_BeginGetStatusForMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,const WSDXML_ELEMENT *pAny,IUnknown *pAsyncState,IWSDAsyncCallback *pAsyncCallback,IWSDAsyncResult **ppResult) {
    return This->lpVtbl->BeginGetStatusForMultipleOperations(This,pOperations,dwOperationCount,pAny,pAsyncState,pAsyncCallback,ppResult);
}
static __WIDL_INLINE HRESULT IWSDServiceProxyEventing_EndGetStatusForMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,IWSDAsyncResult *pResult,WSD_EVENTING_EXPIRES **ppExpires,WSDXML_ELEMENT **ppAny) {
    return This->lpVtbl->EndGetStatusForMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny);
}
#endif
#endif

#endif


#endif  /* __IWSDServiceProxyEventing_INTERFACE_DEFINED__ */

#endif
HRESULT WINAPI WSDCreateDeviceProxy(LPCWSTR pszDeviceId, LPCWSTR pszLocalId, IWSDXMLContext *pContext, IWSDDeviceProxy **ppDeviceProxy);
HRESULT WINAPI WSDCreateDeviceProxyAdvanced(LPCWSTR pszDeviceId, IWSDAddress* pDeviceAddress, LPCWSTR pszLocalId, IWSDXMLContext *pContext, IWSDDeviceProxy **ppDeviceProxy);
#if WINVER >= 0x601
HRESULT WINAPI WSDCreateDeviceProxy2(LPCWSTR pszDeviceId, LPCWSTR pszLocalId, IWSDXMLContext *pContext, WSD_CONFIG_PARAM *pConfigParams, DWORD dwConfigParamCount, IWSDDeviceProxy **ppDeviceProxy);
#endif
#endif
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __wsdclient_h__ */
