/*** Autogenerated by WIDL 10.13 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__

/* 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 inline HRESULT IWSDAsyncResult_QueryInterface(IWSDAsyncResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IWSDAsyncResult_AddRef(IWSDAsyncResult* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IWSDAsyncResult_Release(IWSDAsyncResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDAsyncResult methods ***/
static inline HRESULT IWSDAsyncResult_SetCallback(IWSDAsyncResult* This,IWSDAsyncCallback *pCallback,IUnknown *pAsyncState) {
    return This->lpVtbl->SetCallback(This,pCallback,pAsyncState);
}
static inline HRESULT IWSDAsyncResult_SetWaitHandle(IWSDAsyncResult* This,HANDLE hWaitHandle) {
    return This->lpVtbl->SetWaitHandle(This,hWaitHandle);
}
static inline HRESULT IWSDAsyncResult_HasCompleted(IWSDAsyncResult* This) {
    return This->lpVtbl->HasCompleted(This);
}
static inline HRESULT IWSDAsyncResult_GetAsyncState(IWSDAsyncResult* This,IUnknown **ppAsyncState) {
    return This->lpVtbl->GetAsyncState(This,ppAsyncState);
}
static inline HRESULT IWSDAsyncResult_Abort(IWSDAsyncResult* This) {
    return This->lpVtbl->Abort(This);
}
static inline HRESULT IWSDAsyncResult_GetEvent(IWSDAsyncResult* This,WSD_EVENT *pEvent) {
    return This->lpVtbl->GetEvent(This,pEvent);
}
static 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 inline HRESULT IWSDAsyncCallback_QueryInterface(IWSDAsyncCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IWSDAsyncCallback_AddRef(IWSDAsyncCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IWSDAsyncCallback_Release(IWSDAsyncCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDAsyncCallback methods ***/
static 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 inline HRESULT IWSDMetadataExchange_QueryInterface(IWSDMetadataExchange* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IWSDMetadataExchange_AddRef(IWSDMetadataExchange* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IWSDMetadataExchange_Release(IWSDMetadataExchange* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDMetadataExchange methods ***/
static 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 inline HRESULT IWSDEventingStatus_QueryInterface(IWSDEventingStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IWSDEventingStatus_AddRef(IWSDEventingStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IWSDEventingStatus_Release(IWSDEventingStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDEventingStatus methods ***/
static inline void IWSDEventingStatus_SubscriptionRenewed(IWSDEventingStatus* This,LPCWSTR pszSubscriptionAction) {
    This->lpVtbl->SubscriptionRenewed(This,pszSubscriptionAction);
}
static inline void IWSDEventingStatus_SubscriptionRenewalFailed(IWSDEventingStatus* This,LPCWSTR pszSubscriptionAction,HRESULT hr) {
    This->lpVtbl->SubscriptionRenewalFailed(This,pszSubscriptionAction,hr);
}
static 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 inline HRESULT IWSDEndpointProxy_QueryInterface(IWSDEndpointProxy* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IWSDEndpointProxy_AddRef(IWSDEndpointProxy* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IWSDEndpointProxy_Release(IWSDEndpointProxy* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDEndpointProxy methods ***/
static inline HRESULT IWSDEndpointProxy_SendOneWayRequest(IWSDEndpointProxy* This,const void *pBody,const WSD_OPERATION *pOperation) {
    return This->lpVtbl->SendOneWayRequest(This,pBody,pOperation);
}
static 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 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 inline HRESULT IWSDEndpointProxy_AbortAsyncOperation(IWSDEndpointProxy* This,IWSDAsyncResult *pAsyncResult) {
    return This->lpVtbl->AbortAsyncOperation(This,pAsyncResult);
}
static inline HRESULT IWSDEndpointProxy_ProcessFault(IWSDEndpointProxy* This,const WSD_SOAP_FAULT *pFault) {
    return This->lpVtbl->ProcessFault(This,pFault);
}
static inline HRESULT IWSDEndpointProxy_GetErrorInfo(IWSDEndpointProxy* This,LPCWSTR *ppszErrorInfo) {
    return This->lpVtbl->GetErrorInfo(This,ppszErrorInfo);
}
static 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 inline HRESULT IWSDDeviceProxy_QueryInterface(IWSDDeviceProxy* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IWSDDeviceProxy_AddRef(IWSDDeviceProxy* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IWSDDeviceProxy_Release(IWSDDeviceProxy* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDDeviceProxy methods ***/
static 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 inline HRESULT IWSDDeviceProxy_BeginGetMetadata(IWSDDeviceProxy* This,IWSDAsyncResult **ppResult) {
    return This->lpVtbl->BeginGetMetadata(This,ppResult);
}
static inline HRESULT IWSDDeviceProxy_EndGetMetadata(IWSDDeviceProxy* This,IWSDAsyncResult *pResult) {
    return This->lpVtbl->EndGetMetadata(This,pResult);
}
static inline HRESULT IWSDDeviceProxy_GetHostMetadata(IWSDDeviceProxy* This,WSD_HOST_METADATA **ppHostMetadata) {
    return This->lpVtbl->GetHostMetadata(This,ppHostMetadata);
}
static inline HRESULT IWSDDeviceProxy_GetThisModelMetadata(IWSDDeviceProxy* This,WSD_THIS_MODEL_METADATA **ppManufacturerMetadata) {
    return This->lpVtbl->GetThisModelMetadata(This,ppManufacturerMetadata);
}
static inline HRESULT IWSDDeviceProxy_GetThisDeviceMetadata(IWSDDeviceProxy* This,WSD_THIS_DEVICE_METADATA **ppThisDeviceMetadata) {
    return This->lpVtbl->GetThisDeviceMetadata(This,ppThisDeviceMetadata);
}
static inline HRESULT IWSDDeviceProxy_GetAllMetadata(IWSDDeviceProxy* This,WSD_METADATA_SECTION_LIST **ppMetadata) {
    return This->lpVtbl->GetAllMetadata(This,ppMetadata);
}
static inline HRESULT IWSDDeviceProxy_GetServiceProxyById(IWSDDeviceProxy* This,LPCWSTR pszServiceId,IWSDServiceProxy **ppServiceProxy) {
    return This->lpVtbl->GetServiceProxyById(This,pszServiceId,ppServiceProxy);
}
static inline HRESULT IWSDDeviceProxy_GetServiceProxyByType(IWSDDeviceProxy* This,const WSDXML_NAME *pType,IWSDServiceProxy **ppServiceProxy) {
    return This->lpVtbl->GetServiceProxyByType(This,pType,ppServiceProxy);
}
static 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 inline HRESULT IWSDServiceProxy_QueryInterface(IWSDServiceProxy* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IWSDServiceProxy_AddRef(IWSDServiceProxy* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IWSDServiceProxy_Release(IWSDServiceProxy* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDMetadataExchange methods ***/
static inline HRESULT IWSDServiceProxy_GetMetadata(IWSDServiceProxy* This,WSD_METADATA_SECTION_LIST **MetadataOut) {
    return This->lpVtbl->GetMetadata(This,MetadataOut);
}
/*** IWSDServiceProxy methods ***/
static inline HRESULT IWSDServiceProxy_BeginGetMetadata(IWSDServiceProxy* This,IWSDAsyncResult **ppResult) {
    return This->lpVtbl->BeginGetMetadata(This,ppResult);
}
static inline HRESULT IWSDServiceProxy_EndGetMetadata(IWSDServiceProxy* This,IWSDAsyncResult *pResult,WSD_METADATA_SECTION_LIST **ppMetadata) {
    return This->lpVtbl->EndGetMetadata(This,pResult,ppMetadata);
}
static inline HRESULT IWSDServiceProxy_GetServiceMetadata(IWSDServiceProxy* This,WSD_SERVICE_METADATA **ppServiceMetadata) {
    return This->lpVtbl->GetServiceMetadata(This,ppServiceMetadata);
}
static 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 inline HRESULT IWSDServiceProxy_UnsubscribeToOperation(IWSDServiceProxy* This,const WSD_OPERATION *pOperation) {
    return This->lpVtbl->UnsubscribeToOperation(This,pOperation);
}
static inline HRESULT IWSDServiceProxy_SetEventingStatusCallback(IWSDServiceProxy* This,IWSDEventingStatus *pStatus) {
    return This->lpVtbl->SetEventingStatusCallback(This,pStatus);
}
static 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 inline HRESULT IWSDServiceProxyEventing_QueryInterface(IWSDServiceProxyEventing* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IWSDServiceProxyEventing_AddRef(IWSDServiceProxyEventing* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IWSDServiceProxyEventing_Release(IWSDServiceProxyEventing* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDMetadataExchange methods ***/
static inline HRESULT IWSDServiceProxyEventing_GetMetadata(IWSDServiceProxyEventing* This,WSD_METADATA_SECTION_LIST **MetadataOut) {
    return This->lpVtbl->GetMetadata(This,MetadataOut);
}
/*** IWSDServiceProxy methods ***/
static inline HRESULT IWSDServiceProxyEventing_BeginGetMetadata(IWSDServiceProxyEventing* This,IWSDAsyncResult **ppResult) {
    return This->lpVtbl->BeginGetMetadata(This,ppResult);
}
static inline HRESULT IWSDServiceProxyEventing_EndGetMetadata(IWSDServiceProxyEventing* This,IWSDAsyncResult *pResult,WSD_METADATA_SECTION_LIST **ppMetadata) {
    return This->lpVtbl->EndGetMetadata(This,pResult,ppMetadata);
}
static inline HRESULT IWSDServiceProxyEventing_GetServiceMetadata(IWSDServiceProxyEventing* This,WSD_SERVICE_METADATA **ppServiceMetadata) {
    return This->lpVtbl->GetServiceMetadata(This,ppServiceMetadata);
}
static 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 inline HRESULT IWSDServiceProxyEventing_UnsubscribeToOperation(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperation) {
    return This->lpVtbl->UnsubscribeToOperation(This,pOperation);
}
static inline HRESULT IWSDServiceProxyEventing_SetEventingStatusCallback(IWSDServiceProxyEventing* This,IWSDEventingStatus *pStatus) {
    return This->lpVtbl->SetEventingStatusCallback(This,pStatus);
}
static inline HRESULT IWSDServiceProxyEventing_GetEndpointProxy(IWSDServiceProxyEventing* This,IWSDEndpointProxy **ppProxy) {
    return This->lpVtbl->GetEndpointProxy(This,ppProxy);
}
/*** IWSDServiceProxyEventing methods ***/
static 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 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 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 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 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 inline HRESULT IWSDServiceProxyEventing_EndUnsubscribeToMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,IWSDAsyncResult *pResult) {
    return This->lpVtbl->EndUnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pResult);
}
static 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 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 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 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 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 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__ */
