/*** Autogenerated by WIDL 7.0-rc2 from include/rdpencomapi.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 __rdpencomapi_h__
#define __rdpencomapi_h__

/* Forward declarations */

#ifndef __IRDPSRAPIDebug_FWD_DEFINED__
#define __IRDPSRAPIDebug_FWD_DEFINED__
typedef interface IRDPSRAPIDebug IRDPSRAPIDebug;
#ifdef __cplusplus
interface IRDPSRAPIDebug;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIPerfCounterLogger_FWD_DEFINED__
#define __IRDPSRAPIPerfCounterLogger_FWD_DEFINED__
typedef interface IRDPSRAPIPerfCounterLogger IRDPSRAPIPerfCounterLogger;
#ifdef __cplusplus
interface IRDPSRAPIPerfCounterLogger;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIPerfCounterLoggingManager_FWD_DEFINED__
#define __IRDPSRAPIPerfCounterLoggingManager_FWD_DEFINED__
typedef interface IRDPSRAPIPerfCounterLoggingManager IRDPSRAPIPerfCounterLoggingManager;
#ifdef __cplusplus
interface IRDPSRAPIPerfCounterLoggingManager;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIAudioStream_FWD_DEFINED__
#define __IRDPSRAPIAudioStream_FWD_DEFINED__
typedef interface IRDPSRAPIAudioStream IRDPSRAPIAudioStream;
#ifdef __cplusplus
interface IRDPSRAPIAudioStream;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIClipboardUseEvents_FWD_DEFINED__
#define __IRDPSRAPIClipboardUseEvents_FWD_DEFINED__
typedef interface IRDPSRAPIClipboardUseEvents IRDPSRAPIClipboardUseEvents;
#ifdef __cplusplus
interface IRDPSRAPIClipboardUseEvents;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIWindow_FWD_DEFINED__
#define __IRDPSRAPIWindow_FWD_DEFINED__
typedef interface IRDPSRAPIWindow IRDPSRAPIWindow;
#ifdef __cplusplus
interface IRDPSRAPIWindow;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIWindowList_FWD_DEFINED__
#define __IRDPSRAPIWindowList_FWD_DEFINED__
typedef interface IRDPSRAPIWindowList IRDPSRAPIWindowList;
#ifdef __cplusplus
interface IRDPSRAPIWindowList;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIApplication_FWD_DEFINED__
#define __IRDPSRAPIApplication_FWD_DEFINED__
typedef interface IRDPSRAPIApplication IRDPSRAPIApplication;
#ifdef __cplusplus
interface IRDPSRAPIApplication;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIApplicationList_FWD_DEFINED__
#define __IRDPSRAPIApplicationList_FWD_DEFINED__
typedef interface IRDPSRAPIApplicationList IRDPSRAPIApplicationList;
#ifdef __cplusplus
interface IRDPSRAPIApplicationList;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIApplicationFilter_FWD_DEFINED__
#define __IRDPSRAPIApplicationFilter_FWD_DEFINED__
typedef interface IRDPSRAPIApplicationFilter IRDPSRAPIApplicationFilter;
#ifdef __cplusplus
interface IRDPSRAPIApplicationFilter;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPISessionProperties_FWD_DEFINED__
#define __IRDPSRAPISessionProperties_FWD_DEFINED__
typedef interface IRDPSRAPISessionProperties IRDPSRAPISessionProperties;
#ifdef __cplusplus
interface IRDPSRAPISessionProperties;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIInvitation_FWD_DEFINED__
#define __IRDPSRAPIInvitation_FWD_DEFINED__
typedef interface IRDPSRAPIInvitation IRDPSRAPIInvitation;
#ifdef __cplusplus
interface IRDPSRAPIInvitation;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIInvitationManager_FWD_DEFINED__
#define __IRDPSRAPIInvitationManager_FWD_DEFINED__
typedef interface IRDPSRAPIInvitationManager IRDPSRAPIInvitationManager;
#ifdef __cplusplus
interface IRDPSRAPIInvitationManager;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPITcpConnectionInfo_FWD_DEFINED__
#define __IRDPSRAPITcpConnectionInfo_FWD_DEFINED__
typedef interface IRDPSRAPITcpConnectionInfo IRDPSRAPITcpConnectionInfo;
#ifdef __cplusplus
interface IRDPSRAPITcpConnectionInfo;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIAttendee_FWD_DEFINED__
#define __IRDPSRAPIAttendee_FWD_DEFINED__
typedef interface IRDPSRAPIAttendee IRDPSRAPIAttendee;
#ifdef __cplusplus
interface IRDPSRAPIAttendee;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIAttendeeManager_FWD_DEFINED__
#define __IRDPSRAPIAttendeeManager_FWD_DEFINED__
typedef interface IRDPSRAPIAttendeeManager IRDPSRAPIAttendeeManager;
#ifdef __cplusplus
interface IRDPSRAPIAttendeeManager;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIAttendeeDisconnectInfo_FWD_DEFINED__
#define __IRDPSRAPIAttendeeDisconnectInfo_FWD_DEFINED__
typedef interface IRDPSRAPIAttendeeDisconnectInfo IRDPSRAPIAttendeeDisconnectInfo;
#ifdef __cplusplus
interface IRDPSRAPIAttendeeDisconnectInfo;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIVirtualChannel_FWD_DEFINED__
#define __IRDPSRAPIVirtualChannel_FWD_DEFINED__
typedef interface IRDPSRAPIVirtualChannel IRDPSRAPIVirtualChannel;
#ifdef __cplusplus
interface IRDPSRAPIVirtualChannel;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIVirtualChannelManager_FWD_DEFINED__
#define __IRDPSRAPIVirtualChannelManager_FWD_DEFINED__
typedef interface IRDPSRAPIVirtualChannelManager IRDPSRAPIVirtualChannelManager;
#ifdef __cplusplus
interface IRDPSRAPIVirtualChannelManager;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIViewer_FWD_DEFINED__
#define __IRDPSRAPIViewer_FWD_DEFINED__
typedef interface IRDPSRAPIViewer IRDPSRAPIViewer;
#ifdef __cplusplus
interface IRDPSRAPIViewer;
#endif /* __cplusplus */
#endif

#ifndef __IRDPViewerRenderingSurface_FWD_DEFINED__
#define __IRDPViewerRenderingSurface_FWD_DEFINED__
typedef interface IRDPViewerRenderingSurface IRDPViewerRenderingSurface;
#ifdef __cplusplus
interface IRDPViewerRenderingSurface;
#endif /* __cplusplus */
#endif

#ifndef __IRDPViewerInputSink_FWD_DEFINED__
#define __IRDPViewerInputSink_FWD_DEFINED__
typedef interface IRDPViewerInputSink IRDPViewerInputSink;
#ifdef __cplusplus
interface IRDPViewerInputSink;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIFrameBuffer_FWD_DEFINED__
#define __IRDPSRAPIFrameBuffer_FWD_DEFINED__
typedef interface IRDPSRAPIFrameBuffer IRDPSRAPIFrameBuffer;
#ifdef __cplusplus
interface IRDPSRAPIFrameBuffer;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPITransportStreamBuffer_FWD_DEFINED__
#define __IRDPSRAPITransportStreamBuffer_FWD_DEFINED__
typedef interface IRDPSRAPITransportStreamBuffer IRDPSRAPITransportStreamBuffer;
#ifdef __cplusplus
interface IRDPSRAPITransportStreamBuffer;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPITransportStreamEvents_FWD_DEFINED__
#define __IRDPSRAPITransportStreamEvents_FWD_DEFINED__
typedef interface IRDPSRAPITransportStreamEvents IRDPSRAPITransportStreamEvents;
#ifdef __cplusplus
interface IRDPSRAPITransportStreamEvents;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPITransportStream_FWD_DEFINED__
#define __IRDPSRAPITransportStream_FWD_DEFINED__
typedef interface IRDPSRAPITransportStream IRDPSRAPITransportStream;
#ifdef __cplusplus
interface IRDPSRAPITransportStream;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPISharingSession_FWD_DEFINED__
#define __IRDPSRAPISharingSession_FWD_DEFINED__
typedef interface IRDPSRAPISharingSession IRDPSRAPISharingSession;
#ifdef __cplusplus
interface IRDPSRAPISharingSession;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPISharingSession2_FWD_DEFINED__
#define __IRDPSRAPISharingSession2_FWD_DEFINED__
typedef interface IRDPSRAPISharingSession2 IRDPSRAPISharingSession2;
#ifdef __cplusplus
interface IRDPSRAPISharingSession2;
#endif /* __cplusplus */
#endif

#ifndef ___IRDPSessionEvents_FWD_DEFINED__
#define ___IRDPSessionEvents_FWD_DEFINED__
typedef interface _IRDPSessionEvents _IRDPSessionEvents;
#ifdef __cplusplus
interface _IRDPSessionEvents;
#endif /* __cplusplus */
#endif

#ifndef __RDPViewer_FWD_DEFINED__
#define __RDPViewer_FWD_DEFINED__
#ifdef __cplusplus
typedef class RDPViewer RDPViewer;
#else
typedef struct RDPViewer RDPViewer;
#endif /* defined __cplusplus */
#endif /* defined __RDPViewer_FWD_DEFINED__ */

#ifndef __RDPSRAPISessionProperties_FWD_DEFINED__
#define __RDPSRAPISessionProperties_FWD_DEFINED__
#ifdef __cplusplus
typedef class RDPSRAPISessionProperties RDPSRAPISessionProperties;
#else
typedef struct RDPSRAPISessionProperties RDPSRAPISessionProperties;
#endif /* defined __cplusplus */
#endif /* defined __RDPSRAPISessionProperties_FWD_DEFINED__ */

#ifndef __RDPSRAPIInvitationManager_FWD_DEFINED__
#define __RDPSRAPIInvitationManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class RDPSRAPIInvitationManager RDPSRAPIInvitationManager;
#else
typedef struct RDPSRAPIInvitationManager RDPSRAPIInvitationManager;
#endif /* defined __cplusplus */
#endif /* defined __RDPSRAPIInvitationManager_FWD_DEFINED__ */

#ifndef __RDPSRAPIInvitation_FWD_DEFINED__
#define __RDPSRAPIInvitation_FWD_DEFINED__
#ifdef __cplusplus
typedef class RDPSRAPIInvitation RDPSRAPIInvitation;
#else
typedef struct RDPSRAPIInvitation RDPSRAPIInvitation;
#endif /* defined __cplusplus */
#endif /* defined __RDPSRAPIInvitation_FWD_DEFINED__ */

#ifndef __RDPSRAPIAttendeeManager_FWD_DEFINED__
#define __RDPSRAPIAttendeeManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class RDPSRAPIAttendeeManager RDPSRAPIAttendeeManager;
#else
typedef struct RDPSRAPIAttendeeManager RDPSRAPIAttendeeManager;
#endif /* defined __cplusplus */
#endif /* defined __RDPSRAPIAttendeeManager_FWD_DEFINED__ */

#ifndef __RDPSRAPIAttendee_FWD_DEFINED__
#define __RDPSRAPIAttendee_FWD_DEFINED__
#ifdef __cplusplus
typedef class RDPSRAPIAttendee RDPSRAPIAttendee;
#else
typedef struct RDPSRAPIAttendee RDPSRAPIAttendee;
#endif /* defined __cplusplus */
#endif /* defined __RDPSRAPIAttendee_FWD_DEFINED__ */

#ifndef __RDPSRAPIAttendeeDisconnectInfo_FWD_DEFINED__
#define __RDPSRAPIAttendeeDisconnectInfo_FWD_DEFINED__
#ifdef __cplusplus
typedef class RDPSRAPIAttendeeDisconnectInfo RDPSRAPIAttendeeDisconnectInfo;
#else
typedef struct RDPSRAPIAttendeeDisconnectInfo RDPSRAPIAttendeeDisconnectInfo;
#endif /* defined __cplusplus */
#endif /* defined __RDPSRAPIAttendeeDisconnectInfo_FWD_DEFINED__ */

#ifndef __RDPSRAPIApplicationFilter_FWD_DEFINED__
#define __RDPSRAPIApplicationFilter_FWD_DEFINED__
#ifdef __cplusplus
typedef class RDPSRAPIApplicationFilter RDPSRAPIApplicationFilter;
#else
typedef struct RDPSRAPIApplicationFilter RDPSRAPIApplicationFilter;
#endif /* defined __cplusplus */
#endif /* defined __RDPSRAPIApplicationFilter_FWD_DEFINED__ */

#ifndef __RDPSRAPIApplicationList_FWD_DEFINED__
#define __RDPSRAPIApplicationList_FWD_DEFINED__
#ifdef __cplusplus
typedef class RDPSRAPIApplicationList RDPSRAPIApplicationList;
#else
typedef struct RDPSRAPIApplicationList RDPSRAPIApplicationList;
#endif /* defined __cplusplus */
#endif /* defined __RDPSRAPIApplicationList_FWD_DEFINED__ */

#ifndef __RDPSRAPIApplication_FWD_DEFINED__
#define __RDPSRAPIApplication_FWD_DEFINED__
#ifdef __cplusplus
typedef class RDPSRAPIApplication RDPSRAPIApplication;
#else
typedef struct RDPSRAPIApplication RDPSRAPIApplication;
#endif /* defined __cplusplus */
#endif /* defined __RDPSRAPIApplication_FWD_DEFINED__ */

#ifndef __RDPSRAPIWindowList_FWD_DEFINED__
#define __RDPSRAPIWindowList_FWD_DEFINED__
#ifdef __cplusplus
typedef class RDPSRAPIWindowList RDPSRAPIWindowList;
#else
typedef struct RDPSRAPIWindowList RDPSRAPIWindowList;
#endif /* defined __cplusplus */
#endif /* defined __RDPSRAPIWindowList_FWD_DEFINED__ */

#ifndef __RDPSRAPIWindow_FWD_DEFINED__
#define __RDPSRAPIWindow_FWD_DEFINED__
#ifdef __cplusplus
typedef class RDPSRAPIWindow RDPSRAPIWindow;
#else
typedef struct RDPSRAPIWindow RDPSRAPIWindow;
#endif /* defined __cplusplus */
#endif /* defined __RDPSRAPIWindow_FWD_DEFINED__ */

#ifndef __RDPSRAPITcpConnectionInfo_FWD_DEFINED__
#define __RDPSRAPITcpConnectionInfo_FWD_DEFINED__
#ifdef __cplusplus
typedef class RDPSRAPITcpConnectionInfo RDPSRAPITcpConnectionInfo;
#else
typedef struct RDPSRAPITcpConnectionInfo RDPSRAPITcpConnectionInfo;
#endif /* defined __cplusplus */
#endif /* defined __RDPSRAPITcpConnectionInfo_FWD_DEFINED__ */

#ifndef __RDPSession_FWD_DEFINED__
#define __RDPSession_FWD_DEFINED__
#ifdef __cplusplus
typedef class RDPSession RDPSession;
#else
typedef struct RDPSession RDPSession;
#endif /* defined __cplusplus */
#endif /* defined __RDPSession_FWD_DEFINED__ */

#ifndef __RDPSRAPIFrameBuffer_FWD_DEFINED__
#define __RDPSRAPIFrameBuffer_FWD_DEFINED__
#ifdef __cplusplus
typedef class RDPSRAPIFrameBuffer RDPSRAPIFrameBuffer;
#else
typedef struct RDPSRAPIFrameBuffer RDPSRAPIFrameBuffer;
#endif /* defined __cplusplus */
#endif /* defined __RDPSRAPIFrameBuffer_FWD_DEFINED__ */

#ifndef __RDPTransportStreamBuffer_FWD_DEFINED__
#define __RDPTransportStreamBuffer_FWD_DEFINED__
#ifdef __cplusplus
typedef class RDPTransportStreamBuffer RDPTransportStreamBuffer;
#else
typedef struct RDPTransportStreamBuffer RDPTransportStreamBuffer;
#endif /* defined __cplusplus */
#endif /* defined __RDPTransportStreamBuffer_FWD_DEFINED__ */

#ifndef __RDPTransportStreamEvents_FWD_DEFINED__
#define __RDPTransportStreamEvents_FWD_DEFINED__
#ifdef __cplusplus
typedef class RDPTransportStreamEvents RDPTransportStreamEvents;
#else
typedef struct RDPTransportStreamEvents RDPTransportStreamEvents;
#endif /* defined __cplusplus */
#endif /* defined __RDPTransportStreamEvents_FWD_DEFINED__ */

/* Headers for imported files */

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

#ifdef __cplusplus
extern "C" {
#endif

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
#define DISPID_RDPSRAPI_METHOD_OPEN (100)

#define DISPID_RDPSRAPI_METHOD_CLOSE (101)

#define DISPID_RDPSRAPI_METHOD_SETSHAREDRECT (102)

#define DISPID_RDPSRAPI_METHOD_GETSHAREDRECT (103)

#define DISPID_RDPSRAPI_METHOD_VIEWERCONNECT (104)

#define DISPID_RDPSRAPI_METHOD_VIEWERDISCONNECT (105)

#define DISPID_RDPSRAPI_METHOD_TERMINATE_CONNECTION (106)

#define DISPID_RDPSRAPI_METHOD_CREATE_INVITATION (107)

#define DISPID_RDPSRAPI_METHOD_REQUEST_CONTROL (108)

#define DISPID_RDPSRAPI_METHOD_VIRTUAL_CHANNEL_CREATE (109)

#define DISPID_RDPSRAPI_METHOD_VIRTUAL_CHANNEL_SEND_DATA (110)

#define DISPID_RDPSRAPI_METHOD_VIRTUAL_CHANNEL_SET_ACCESS (111)

#define DISPID_RDPSRAPI_METHOD_PAUSE (112)

#define DISPID_RDPSRAPI_METHOD_RESUME (113)

#define DISPID_RDPSRAPI_METHOD_SHOW_WINDOW (114)

#define DISPID_RDPSRAPI_METHOD_REQUEST_COLOR_DEPTH_CHANGE (115)

#define DISPID_RDPSRAPI_METHOD_STARTREVCONNECTLISTENER (116)

#define DISPID_RDPSRAPI_METHOD_CONNECTTOCLIENT (117)

#define DISPID_RDPSRAPI_METHOD_SET_RENDERING_SURFACE (118)

#define DISPID_RDPSRAPI_METHOD_SEND_MOUSE_BUTTON_EVENT (119)

#define DISPID_RDPSRAPI_METHOD_SEND_MOUSE_MOVE_EVENT (120)

#define DISPID_RDPSRAPI_METHOD_SEND_MOUSE_WHEEL_EVENT (121)

#define DISPID_RDPSRAPI_METHOD_SEND_KEYBOARD_EVENT (122)

#define DISPID_RDPSRAPI_METHOD_SEND_SYNC_EVENT (123)

#define DISPID_RDPSRAPI_METHOD_BEGIN_TOUCH_FRAME (124)

#define DISPID_RDPSRAPI_METHOD_ADD_TOUCH_INPUT (125)

#define DISPID_RDPSRAPI_METHOD_END_TOUCH_FRAME (126)

#define DISPID_RDPSRAPI_METHOD_CONNECTUSINGTRANSPORTSTREAM (127)

#define DISPID_RDPSRAPI_METHOD_SENDCONTROLLEVELCHANGERESPONSE (148)

#define DISPID_RDPSRAPI_METHOD_GETFRAMEBUFFERBITS (149)

#define DISPID_RDPSRAPI_PROP_DISPIDVALUE (200)

#define DISPID_RDPSRAPI_PROP_ID (201)

#define DISPID_RDPSRAPI_PROP_SESSION_PROPERTIES (202)

#define DISPID_RDPSRAPI_PROP_ATTENDEES (203)

#define DISPID_RDPSRAPI_PROP_INVITATIONS (204)

#define DISPID_RDPSRAPI_PROP_INVITATION (205)

#define DISPID_RDPSRAPI_PROP_CHANNELMANAGER (206)

#define DISPID_RDPSRAPI_PROP_VIRTUAL_CHANNEL_GETNAME (207)

#define DISPID_RDPSRAPI_PROP_VIRTUAL_CHANNEL_GETFLAGS (208)

#define DISPID_RDPSRAPI_PROP_VIRTUAL_CHANNEL_GETPRIORITY (209)

#define DISPID_RDPSRAPI_PROP_WINDOWID (210)

#define DISPID_RDPSRAPI_PROP_APPLICATION (211)

#define DISPID_RDPSRAPI_PROP_WINDOWSHARED (212)

#define DISPID_RDPSRAPI_PROP_WINDOWNAME (213)

#define DISPID_RDPSRAPI_PROP_APPNAME (214)

#define DISPID_RDPSRAPI_PROP_APPLICATION_FILTER (215)

#define DISPID_RDPSRAPI_PROP_WINDOW_LIST (216)

#define DISPID_RDPSRAPI_PROP_APPLICATION_LIST (217)

#define DISPID_RDPSRAPI_PROP_APPFILTER_ENABLED (218)

#define DISPID_RDPSRAPI_PROP_APPFILTERENABLED (219)

#define DISPID_RDPSRAPI_PROP_SHARED (220)

#define DISPID_RDPSRAPI_PROP_INVITATIONITEM (221)

#define DISPID_RDPSRAPI_PROP_DBG_CLX_CMDLINE (222)

#define DISPID_RDPSRAPI_PROP_APPFLAGS (223)

#define DISPID_RDPSRAPI_PROP_WNDFLAGS (224)

#define DISPID_RDPSRAPI_PROP_PROTOCOL_TYPE (225)

#define DISPID_RDPSRAPI_PROP_LOCAL_PORT (226)

#define DISPID_RDPSRAPI_PROP_LOCAL_IP (227)

#define DISPID_RDPSRAPI_PROP_PEER_PORT (228)

#define DISPID_RDPSRAPI_PROP_PEER_IP (229)

#define DISPID_RDPSRAPI_PROP_ATTENDEE_FLAGS (230)

#define DISPID_RDPSRAPI_PROP_CONINFO (231)

#define DISPID_RDPSRAPI_PROP_CONNECTION_STRING (232)

#define DISPID_RDPSRAPI_PROP_GROUP_NAME (233)

#define DISPID_RDPSRAPI_PROP_PASSWORD (234)

#define DISPID_RDPSRAPI_PROP_ATTENDEELIMIT (235)

#define DISPID_RDPSRAPI_PROP_REVOKED (236)

#define DISPID_RDPSRAPI_PROP_DISCONNECTED_STRING (237)

#define DISPID_RDPSRAPI_PROP_USESMARTSIZING (238)

#define DISPID_RDPSRAPI_PROP_SESSION_COLORDEPTH (239)

#define DISPID_RDPSRAPI_PROP_REASON (240)

#define DISPID_RDPSRAPI_PROP_CODE (241)

#define DISPID_RDPSRAPI_PROP_CTRL_LEVEL (242)

#define DISPID_RDPSRAPI_PROP_REMOTENAME (243)

#define DISPID_RDPSRAPI_PROP_COUNT (244)

#define DISPID_RDPSRAPI_PROP_FRAMEBUFFER_HEIGHT (251)

#define DISPID_RDPSRAPI_PROP_FRAMEBUFFER_WIDTH (252)

#define DISPID_RDPSRAPI_PROP_FRAMEBUFFER_BPP (253)

#define DISPID_RDPSRAPI_PROP_FRAMEBUFFER (254)

#define DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_CONNECTED (301)

#define DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_DISCONNECTED (302)

#define DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_UPDATE (303)

#define DISPID_RDPSRAPI_EVENT_ON_ERROR (304)

#define DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTED (305)

#define DISPID_RDPSRAPI_EVENT_ON_VIEWER_DISCONNECTED (306)

#define DISPID_RDPSRAPI_EVENT_ON_VIEWER_AUTHENTICATED (307)

#define DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTFAILED (308)

#define DISPID_RDPSRAPI_EVENT_ON_CTRLLEVEL_CHANGE_REQUEST (309)

#define DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_PAUSED (310)

#define DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_RESUMED (311)

#define DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_JOIN (312)

#define DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_LEAVE (313)

#define DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_DATARECEIVED (314)

#define DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_SENDCOMPLETED (315)

#define DISPID_RDPSRAPI_EVENT_ON_APPLICATION_OPEN (316)

#define DISPID_RDPSRAPI_EVENT_ON_APPLICATION_CLOSE (317)

#define DISPID_RDPSRAPI_EVENT_ON_APPLICATION_UPDATE (318)

#define DISPID_RDPSRAPI_EVENT_ON_WINDOW_OPEN (319)

#define DISPID_RDPSRAPI_EVENT_ON_WINDOW_CLOSE (320)

#define DISPID_RDPSRAPI_EVENT_ON_WINDOW_UPDATE (321)

#define DISPID_RDPSRAPI_EVENT_ON_APPFILTER_UPDATE (322)

#define DISPID_RDPSRAPI_EVENT_ON_SHARED_RECT_CHANGED (323)

#define DISPID_RDPSRAPI_EVENT_ON_FOCUSRELEASED (324)

#define DISPID_RDPSRAPI_EVENT_ON_SHARED_DESKTOP_SETTINGS_CHANGED (325)

#define DISPID_RDPSRAPI_EVENT_ON_CTRLLEVEL_CHANGE_RESPONSE (338)

#define DISPID_RDPAPI_EVENT_ON_BOUNDING_RECT_CHANGED (340)

#define DISPID_RDPSRAPI_METHOD_STREAM_ALLOCBUFFER (421)

#define DISPID_RDPSRAPI_METHOD_STREAM_FREEBUFFER (422)

#define DISPID_RDPSRAPI_METHOD_STREAMSENDDATA (423)

#define DISPID_RDPSRAPI_METHOD_STREAMREADDATA (424)

#define DISPID_RDPSRAPI_METHOD_STREAMOPEN (425)

#define DISPID_RDPSRAPI_METHOD_STREAMCLOSE (426)

#define DISPID_RDPSRAPI_PROP_STREAMBUFFER_STORAGE (555)

#define DISPID_RDPSRAPI_PROP_STREAMBUFFER_PAYLOADSIZE (558)

#define DISPID_RDPSRAPI_PROP_STREAMBUFFER_PAYLOADOFFSET (559)

#define DISPID_RDPSRAPI_PROP_STREAMBUFFER_CONTEXT (560)

#define DISPID_RDPSRAPI_PROP_STREAMBUFFER_FLAGS (561)

#define DISPID_RDPSRAPI_PROP_STREAMBUFFER_STORESIZE (562)

#define DISPID_RDPSRAPI_EVENT_ON_STREAM_SENDCOMPLETED (632)

#define DISPID_RDPSRAPI_EVENT_ON_STREAM_DATARECEIVED (633)

#define DISPID_RDPSRAPI_EVENT_ON_STREAM_CLOSED (634)

#define DISPID_RDPSRAPI_EVENT_VIEW_MOUSE_BUTTON_RECEIVED (700)

#define DISPID_RDPSRAPI_EVENT_VIEW_MOUSE_MOVE_RECEIVED (701)

#define DISPID_RDPSRAPI_EVENT_VIEW_MOUSE_WHEEL_RECEIVED (702)

typedef enum __WIDL_rdpencomapi_generated_name_00000020 {
    CTRL_LEVEL_MIN = 0,
    CTRL_LEVEL_INVALID = 0,
    CTRL_LEVEL_NONE = 1,
    CTRL_LEVEL_VIEW = 2,
    CTRL_LEVEL_INTERACTIVE = 3,
    CTRL_LEVEL_REQCTRL_VIEW = 4,
    CTRL_LEVEL_REQCTRL_INTERACTIVE = 5,
    CTRL_LEVEL_MAX = 5
} CTRL_LEVEL;
typedef enum __WIDL_rdpencomapi_generated_name_00000021 {
    ATTENDEE_DISCONNECT_REASON_MIN = 0,
    ATTENDEE_DISCONNECT_REASON_APP = 0,
    ATTENDEE_DISCONNECT_REASON_ERR = 1,
    ATTENDEE_DISCONNECT_REASON_CLI = 2,
    ATTENDEE_DISCONNECT_REASON_MAX = 2
} ATTENDEE_DISCONNECT_REASON;
typedef enum __WIDL_rdpencomapi_generated_name_00000022 {
    CHANNEL_PRIORITY_LO = 0,
    CHANNEL_PRIORITY_MED = 1,
    CHANNEL_PRIORITY_HI = 2
} CHANNEL_PRIORITY;
typedef enum __WIDL_rdpencomapi_generated_name_00000023 {
    CHANNEL_FLAGS_LEGACY = 0x1,
    CHANNEL_FLAGS_UNCOMPRESSED = 0x2,
    CHANNEL_FLAGS_DYNAMIC = 0x4
} CHANNEL_FLAGS;
typedef enum __WIDL_rdpencomapi_generated_name_00000024 {
    CHANNEL_ACCESS_ENUM_NONE = 0,
    CHANNEL_ACCESS_ENUM_SENDRECEIVE = 1
} CHANNEL_ACCESS_ENUM;
typedef enum __WIDL_rdpencomapi_generated_name_00000025 {
    ATTENDEE_FLAGS_LOCAL = 1
} RDPENCOMAPI_ATTENDEE_FLAGS;
typedef enum __WIDL_rdpencomapi_generated_name_00000026 {
    WND_FLAG_PRIVILEGED = 1
} RDPSRAPI_WND_FLAGS;
typedef enum __WIDL_rdpencomapi_generated_name_00000027 {
    APP_FLAG_PRIVILEGED = 1
} RDPSRAPI_APP_FLAGS;
typedef enum __WIDL_rdpencomapi_generated_name_00000028 {
    RDPSRAPI_MOUSE_BUTTON_BUTTON1 = 0,
    RDPSRAPI_MOUSE_BUTTON_BUTTON2 = 1,
    RDPSRAPI_MOUSE_BUTTON_BUTTON3 = 2,
    RDPSRAPI_MOUSE_BUTTON_XBUTTON1 = 3,
    RDPSRAPI_MOUSE_BUTTON_XBUTTON2 = 4,
    RDPSRAPI_MOUSE_BUTTON_XBUTTON3 = 5
} RDPSRAPI_MOUSE_BUTTON_TYPE;
typedef enum __WIDL_rdpencomapi_generated_name_00000029 {
    RDPSRAPI_KBD_CODE_SCANCODE = 0,
    RDPSRAPI_KBD_CODE_UNICODE = 1
} RDPSRAPI_KBD_CODE_TYPE;
typedef enum __WIDL_rdpencomapi_generated_name_0000002A {
    RDPSRAPI_KBD_SYNC_FLAG_SCROLL_LOCK = 1,
    RDPSRAPI_KBD_SYNC_FLAG_NUM_LOCK = 2,
    RDPSRAPI_KBD_SYNC_FLAG_CAPS_LOCK = 4,
    RDPSRAPI_KBD_SYNC_FLAG_KANA_LOCK = 8
} RDPSRAPI_KBD_SYNC_FLAG;
/*****************************************************************************
 * IRDPSRAPIDebug interface
 */
#ifndef __IRDPSRAPIDebug_INTERFACE_DEFINED__
#define __IRDPSRAPIDebug_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIDebug, 0xaa1e42b5, 0x496d, 0x4ca4, 0xa6,0x90, 0x34,0x8d,0xcb,0x2e,0xc4,0xad);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("aa1e42b5-496d-4ca4-a690-348dcb2ec4ad")
IRDPSRAPIDebug : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE put_CLXCmdLine(
        BSTR CLXCmdLine) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CLXCmdLine(
        BSTR *pCLXCmdLine) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIDebug, 0xaa1e42b5, 0x496d, 0x4ca4, 0xa6,0x90, 0x34,0x8d,0xcb,0x2e,0xc4,0xad)
#endif
#else
typedef struct IRDPSRAPIDebugVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRDPSRAPIDebug methods ***/
    HRESULT (STDMETHODCALLTYPE *put_CLXCmdLine)(
        IRDPSRAPIDebug *This,
        BSTR CLXCmdLine);

    HRESULT (STDMETHODCALLTYPE *get_CLXCmdLine)(
        IRDPSRAPIDebug *This,
        BSTR *pCLXCmdLine);

    END_INTERFACE
} IRDPSRAPIDebugVtbl;

interface IRDPSRAPIDebug {
    CONST_VTBL IRDPSRAPIDebugVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIDebug_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIDebug_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIDebug_Release(This) (This)->lpVtbl->Release(This)
/*** IRDPSRAPIDebug methods ***/
#define IRDPSRAPIDebug_put_CLXCmdLine(This,CLXCmdLine) (This)->lpVtbl->put_CLXCmdLine(This,CLXCmdLine)
#define IRDPSRAPIDebug_get_CLXCmdLine(This,pCLXCmdLine) (This)->lpVtbl->get_CLXCmdLine(This,pCLXCmdLine)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIDebug_QueryInterface(IRDPSRAPIDebug* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIDebug_AddRef(IRDPSRAPIDebug* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIDebug_Release(IRDPSRAPIDebug* This) {
    return This->lpVtbl->Release(This);
}
/*** IRDPSRAPIDebug methods ***/
static FORCEINLINE HRESULT IRDPSRAPIDebug_put_CLXCmdLine(IRDPSRAPIDebug* This,BSTR CLXCmdLine) {
    return This->lpVtbl->put_CLXCmdLine(This,CLXCmdLine);
}
static FORCEINLINE HRESULT IRDPSRAPIDebug_get_CLXCmdLine(IRDPSRAPIDebug* This,BSTR *pCLXCmdLine) {
    return This->lpVtbl->get_CLXCmdLine(This,pCLXCmdLine);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIDebug_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPIPerfCounterLogger interface
 */
#ifndef __IRDPSRAPIPerfCounterLogger_INTERFACE_DEFINED__
#define __IRDPSRAPIPerfCounterLogger_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIPerfCounterLogger, 0x071c2533, 0x0fa4, 0x4e8f, 0xae,0x83, 0x9c,0x10,0xb4,0x30,0x5a,0xb5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("071c2533-0fa4-4e8f-ae83-9c10b4305ab5")
IRDPSRAPIPerfCounterLogger : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE LogValue(
        INT64 lValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIPerfCounterLogger, 0x071c2533, 0x0fa4, 0x4e8f, 0xae,0x83, 0x9c,0x10,0xb4,0x30,0x5a,0xb5)
#endif
#else
typedef struct IRDPSRAPIPerfCounterLoggerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRDPSRAPIPerfCounterLogger methods ***/
    HRESULT (STDMETHODCALLTYPE *LogValue)(
        IRDPSRAPIPerfCounterLogger *This,
        INT64 lValue);

    END_INTERFACE
} IRDPSRAPIPerfCounterLoggerVtbl;

interface IRDPSRAPIPerfCounterLogger {
    CONST_VTBL IRDPSRAPIPerfCounterLoggerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIPerfCounterLogger_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIPerfCounterLogger_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIPerfCounterLogger_Release(This) (This)->lpVtbl->Release(This)
/*** IRDPSRAPIPerfCounterLogger methods ***/
#define IRDPSRAPIPerfCounterLogger_LogValue(This,lValue) (This)->lpVtbl->LogValue(This,lValue)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIPerfCounterLogger_QueryInterface(IRDPSRAPIPerfCounterLogger* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIPerfCounterLogger_AddRef(IRDPSRAPIPerfCounterLogger* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIPerfCounterLogger_Release(IRDPSRAPIPerfCounterLogger* This) {
    return This->lpVtbl->Release(This);
}
/*** IRDPSRAPIPerfCounterLogger methods ***/
static FORCEINLINE HRESULT IRDPSRAPIPerfCounterLogger_LogValue(IRDPSRAPIPerfCounterLogger* This,INT64 lValue) {
    return This->lpVtbl->LogValue(This,lValue);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIPerfCounterLogger_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPIPerfCounterLoggingManager interface
 */
#ifndef __IRDPSRAPIPerfCounterLoggingManager_INTERFACE_DEFINED__
#define __IRDPSRAPIPerfCounterLoggingManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIPerfCounterLoggingManager, 0x9a512c86, 0xac6e, 0x4a8e, 0xb1,0xa4, 0xfc,0xef,0x36,0x3f,0x6e,0x64);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9a512c86-ac6e-4a8e-b1a4-fcef363f6e64")
IRDPSRAPIPerfCounterLoggingManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateLogger(
        BSTR bstrCounterName,
        IRDPSRAPIPerfCounterLogger **ppLogger) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIPerfCounterLoggingManager, 0x9a512c86, 0xac6e, 0x4a8e, 0xb1,0xa4, 0xfc,0xef,0x36,0x3f,0x6e,0x64)
#endif
#else
typedef struct IRDPSRAPIPerfCounterLoggingManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRDPSRAPIPerfCounterLoggingManager methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateLogger)(
        IRDPSRAPIPerfCounterLoggingManager *This,
        BSTR bstrCounterName,
        IRDPSRAPIPerfCounterLogger **ppLogger);

    END_INTERFACE
} IRDPSRAPIPerfCounterLoggingManagerVtbl;

interface IRDPSRAPIPerfCounterLoggingManager {
    CONST_VTBL IRDPSRAPIPerfCounterLoggingManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIPerfCounterLoggingManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIPerfCounterLoggingManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIPerfCounterLoggingManager_Release(This) (This)->lpVtbl->Release(This)
/*** IRDPSRAPIPerfCounterLoggingManager methods ***/
#define IRDPSRAPIPerfCounterLoggingManager_CreateLogger(This,bstrCounterName,ppLogger) (This)->lpVtbl->CreateLogger(This,bstrCounterName,ppLogger)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIPerfCounterLoggingManager_QueryInterface(IRDPSRAPIPerfCounterLoggingManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIPerfCounterLoggingManager_AddRef(IRDPSRAPIPerfCounterLoggingManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIPerfCounterLoggingManager_Release(IRDPSRAPIPerfCounterLoggingManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IRDPSRAPIPerfCounterLoggingManager methods ***/
static FORCEINLINE HRESULT IRDPSRAPIPerfCounterLoggingManager_CreateLogger(IRDPSRAPIPerfCounterLoggingManager* This,BSTR bstrCounterName,IRDPSRAPIPerfCounterLogger **ppLogger) {
    return This->lpVtbl->CreateLogger(This,bstrCounterName,ppLogger);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIPerfCounterLoggingManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPIAudioStream interface
 */
#ifndef __IRDPSRAPIAudioStream_INTERFACE_DEFINED__
#define __IRDPSRAPIAudioStream_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIAudioStream, 0xe3e30ef9, 0x89c6, 0x4541, 0xba,0x3b, 0x19,0x33,0x6a,0xc6,0xd3,0x1c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e3e30ef9-89c6-4541-ba3b-19336ac6d31c")
IRDPSRAPIAudioStream : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        INT64 *pnPeriodInHundredNsIntervals) = 0;

    virtual HRESULT STDMETHODCALLTYPE Start(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBuffer(
        BYTE **ppbData,
        UINT32 *pcbData,
        UINT64 *pTimestamp) = 0;

    virtual HRESULT STDMETHODCALLTYPE FreeBuffer(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIAudioStream, 0xe3e30ef9, 0x89c6, 0x4541, 0xba,0x3b, 0x19,0x33,0x6a,0xc6,0xd3,0x1c)
#endif
#else
typedef struct IRDPSRAPIAudioStreamVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRDPSRAPIAudioStream methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IRDPSRAPIAudioStream *This,
        INT64 *pnPeriodInHundredNsIntervals);

    HRESULT (STDMETHODCALLTYPE *Start)(
        IRDPSRAPIAudioStream *This);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IRDPSRAPIAudioStream *This);

    HRESULT (STDMETHODCALLTYPE *GetBuffer)(
        IRDPSRAPIAudioStream *This,
        BYTE **ppbData,
        UINT32 *pcbData,
        UINT64 *pTimestamp);

    HRESULT (STDMETHODCALLTYPE *FreeBuffer)(
        IRDPSRAPIAudioStream *This);

    END_INTERFACE
} IRDPSRAPIAudioStreamVtbl;

interface IRDPSRAPIAudioStream {
    CONST_VTBL IRDPSRAPIAudioStreamVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIAudioStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIAudioStream_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIAudioStream_Release(This) (This)->lpVtbl->Release(This)
/*** IRDPSRAPIAudioStream methods ***/
#define IRDPSRAPIAudioStream_Initialize(This,pnPeriodInHundredNsIntervals) (This)->lpVtbl->Initialize(This,pnPeriodInHundredNsIntervals)
#define IRDPSRAPIAudioStream_Start(This) (This)->lpVtbl->Start(This)
#define IRDPSRAPIAudioStream_Stop(This) (This)->lpVtbl->Stop(This)
#define IRDPSRAPIAudioStream_GetBuffer(This,ppbData,pcbData,pTimestamp) (This)->lpVtbl->GetBuffer(This,ppbData,pcbData,pTimestamp)
#define IRDPSRAPIAudioStream_FreeBuffer(This) (This)->lpVtbl->FreeBuffer(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIAudioStream_QueryInterface(IRDPSRAPIAudioStream* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIAudioStream_AddRef(IRDPSRAPIAudioStream* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIAudioStream_Release(IRDPSRAPIAudioStream* This) {
    return This->lpVtbl->Release(This);
}
/*** IRDPSRAPIAudioStream methods ***/
static FORCEINLINE HRESULT IRDPSRAPIAudioStream_Initialize(IRDPSRAPIAudioStream* This,INT64 *pnPeriodInHundredNsIntervals) {
    return This->lpVtbl->Initialize(This,pnPeriodInHundredNsIntervals);
}
static FORCEINLINE HRESULT IRDPSRAPIAudioStream_Start(IRDPSRAPIAudioStream* This) {
    return This->lpVtbl->Start(This);
}
static FORCEINLINE HRESULT IRDPSRAPIAudioStream_Stop(IRDPSRAPIAudioStream* This) {
    return This->lpVtbl->Stop(This);
}
static FORCEINLINE HRESULT IRDPSRAPIAudioStream_GetBuffer(IRDPSRAPIAudioStream* This,BYTE **ppbData,UINT32 *pcbData,UINT64 *pTimestamp) {
    return This->lpVtbl->GetBuffer(This,ppbData,pcbData,pTimestamp);
}
static FORCEINLINE HRESULT IRDPSRAPIAudioStream_FreeBuffer(IRDPSRAPIAudioStream* This) {
    return This->lpVtbl->FreeBuffer(This);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIAudioStream_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPIClipboardUseEvents interface
 */
#ifndef __IRDPSRAPIClipboardUseEvents_INTERFACE_DEFINED__
#define __IRDPSRAPIClipboardUseEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIClipboardUseEvents, 0xd559f59a, 0x7a27, 0x4138, 0x87,0x63, 0x24,0x7c,0xe5,0xf6,0x59,0xa8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d559f59a-7a27-4138-8763-247ce5f659a8")
IRDPSRAPIClipboardUseEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnPasteFromClipboard(
        UINT clipboardFormat,
        IDispatch *pAttendee,
        VARIANT_BOOL *pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIClipboardUseEvents, 0xd559f59a, 0x7a27, 0x4138, 0x87,0x63, 0x24,0x7c,0xe5,0xf6,0x59,0xa8)
#endif
#else
typedef struct IRDPSRAPIClipboardUseEventsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRDPSRAPIClipboardUseEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *OnPasteFromClipboard)(
        IRDPSRAPIClipboardUseEvents *This,
        UINT clipboardFormat,
        IDispatch *pAttendee,
        VARIANT_BOOL *pRetVal);

    END_INTERFACE
} IRDPSRAPIClipboardUseEventsVtbl;

interface IRDPSRAPIClipboardUseEvents {
    CONST_VTBL IRDPSRAPIClipboardUseEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIClipboardUseEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIClipboardUseEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIClipboardUseEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IRDPSRAPIClipboardUseEvents methods ***/
#define IRDPSRAPIClipboardUseEvents_OnPasteFromClipboard(This,clipboardFormat,pAttendee,pRetVal) (This)->lpVtbl->OnPasteFromClipboard(This,clipboardFormat,pAttendee,pRetVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIClipboardUseEvents_QueryInterface(IRDPSRAPIClipboardUseEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIClipboardUseEvents_AddRef(IRDPSRAPIClipboardUseEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIClipboardUseEvents_Release(IRDPSRAPIClipboardUseEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IRDPSRAPIClipboardUseEvents methods ***/
static FORCEINLINE HRESULT IRDPSRAPIClipboardUseEvents_OnPasteFromClipboard(IRDPSRAPIClipboardUseEvents* This,UINT clipboardFormat,IDispatch *pAttendee,VARIANT_BOOL *pRetVal) {
    return This->lpVtbl->OnPasteFromClipboard(This,clipboardFormat,pAttendee,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIClipboardUseEvents_INTERFACE_DEFINED__ */

#ifndef __IRDPSRAPIApplication_FWD_DEFINED__
#define __IRDPSRAPIApplication_FWD_DEFINED__
typedef interface IRDPSRAPIApplication IRDPSRAPIApplication;
#ifdef __cplusplus
interface IRDPSRAPIApplication;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IRDPSRAPIWindow interface
 */
#ifndef __IRDPSRAPIWindow_INTERFACE_DEFINED__
#define __IRDPSRAPIWindow_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIWindow, 0xbeafe0f9, 0xc77b, 0x4933, 0xba,0x9f, 0xa2,0x4c,0xdd,0xcc,0x27,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("beafe0f9-c77b-4933-ba9f-a24cddcc27cf")
IRDPSRAPIWindow : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Id(
        LONG *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Application(
        IRDPSRAPIApplication **pApplication) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Shared(
        VARIANT_BOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Shared(
        VARIANT_BOOL NewVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE Show(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Flags(
        ULONG *pdwFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIWindow, 0xbeafe0f9, 0xc77b, 0x4933, 0xba,0x9f, 0xa2,0x4c,0xdd,0xcc,0x27,0xcf)
#endif
#else
typedef struct IRDPSRAPIWindowVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPIWindow *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPIWindow *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPIWindow *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPIWindow *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPIWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IRDPSRAPIWindow *This,
        LONG *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_Application)(
        IRDPSRAPIWindow *This,
        IRDPSRAPIApplication **pApplication);

    HRESULT (STDMETHODCALLTYPE *get_Shared)(
        IRDPSRAPIWindow *This,
        VARIANT_BOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *put_Shared)(
        IRDPSRAPIWindow *This,
        VARIANT_BOOL NewVal);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        IRDPSRAPIWindow *This,
        BSTR *pRetVal);

    HRESULT (STDMETHODCALLTYPE *Show)(
        IRDPSRAPIWindow *This);

    HRESULT (STDMETHODCALLTYPE *get_Flags)(
        IRDPSRAPIWindow *This,
        ULONG *pdwFlags);

    END_INTERFACE
} IRDPSRAPIWindowVtbl;

interface IRDPSRAPIWindow {
    CONST_VTBL IRDPSRAPIWindowVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIWindow_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIWindow_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIWindow_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPIWindow_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPIWindow_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPIWindow_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPIWindow_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPIWindow methods ***/
#define IRDPSRAPIWindow_get_Id(This,pRetVal) (This)->lpVtbl->get_Id(This,pRetVal)
#define IRDPSRAPIWindow_get_Application(This,pApplication) (This)->lpVtbl->get_Application(This,pApplication)
#define IRDPSRAPIWindow_get_Shared(This,pRetVal) (This)->lpVtbl->get_Shared(This,pRetVal)
#define IRDPSRAPIWindow_put_Shared(This,NewVal) (This)->lpVtbl->put_Shared(This,NewVal)
#define IRDPSRAPIWindow_get_Name(This,pRetVal) (This)->lpVtbl->get_Name(This,pRetVal)
#define IRDPSRAPIWindow_Show(This) (This)->lpVtbl->Show(This)
#define IRDPSRAPIWindow_get_Flags(This,pdwFlags) (This)->lpVtbl->get_Flags(This,pdwFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIWindow_QueryInterface(IRDPSRAPIWindow* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIWindow_AddRef(IRDPSRAPIWindow* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIWindow_Release(IRDPSRAPIWindow* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPIWindow_GetTypeInfoCount(IRDPSRAPIWindow* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPIWindow_GetTypeInfo(IRDPSRAPIWindow* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPIWindow_GetIDsOfNames(IRDPSRAPIWindow* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPIWindow_Invoke(IRDPSRAPIWindow* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPIWindow methods ***/
static FORCEINLINE HRESULT IRDPSRAPIWindow_get_Id(IRDPSRAPIWindow* This,LONG *pRetVal) {
    return This->lpVtbl->get_Id(This,pRetVal);
}
static FORCEINLINE HRESULT IRDPSRAPIWindow_get_Application(IRDPSRAPIWindow* This,IRDPSRAPIApplication **pApplication) {
    return This->lpVtbl->get_Application(This,pApplication);
}
static FORCEINLINE HRESULT IRDPSRAPIWindow_get_Shared(IRDPSRAPIWindow* This,VARIANT_BOOL *pRetVal) {
    return This->lpVtbl->get_Shared(This,pRetVal);
}
static FORCEINLINE HRESULT IRDPSRAPIWindow_put_Shared(IRDPSRAPIWindow* This,VARIANT_BOOL NewVal) {
    return This->lpVtbl->put_Shared(This,NewVal);
}
static FORCEINLINE HRESULT IRDPSRAPIWindow_get_Name(IRDPSRAPIWindow* This,BSTR *pRetVal) {
    return This->lpVtbl->get_Name(This,pRetVal);
}
static FORCEINLINE HRESULT IRDPSRAPIWindow_Show(IRDPSRAPIWindow* This) {
    return This->lpVtbl->Show(This);
}
static FORCEINLINE HRESULT IRDPSRAPIWindow_get_Flags(IRDPSRAPIWindow* This,ULONG *pdwFlags) {
    return This->lpVtbl->get_Flags(This,pdwFlags);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIWindow_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPIWindowList interface
 */
#ifndef __IRDPSRAPIWindowList_INTERFACE_DEFINED__
#define __IRDPSRAPIWindowList_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIWindowList, 0x8a05ce44, 0x715a, 0x4116, 0xa1,0x89, 0xa1,0x18,0xf3,0x0a,0x07,0xbd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8a05ce44-715a-4116-a189-a118f30a07bd")
IRDPSRAPIWindowList : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        LONG item,
        IRDPSRAPIWindow **pWindow) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIWindowList, 0x8a05ce44, 0x715a, 0x4116, 0xa1,0x89, 0xa1,0x18,0xf3,0x0a,0x07,0xbd)
#endif
#else
typedef struct IRDPSRAPIWindowListVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPIWindowList *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPIWindowList *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPIWindowList *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPIWindowList *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPIWindowList methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IRDPSRAPIWindowList *This,
        IUnknown **retval);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IRDPSRAPIWindowList *This,
        LONG item,
        IRDPSRAPIWindow **pWindow);

    END_INTERFACE
} IRDPSRAPIWindowListVtbl;

interface IRDPSRAPIWindowList {
    CONST_VTBL IRDPSRAPIWindowListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIWindowList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIWindowList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIWindowList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPIWindowList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPIWindowList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPIWindowList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPIWindowList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPIWindowList methods ***/
#define IRDPSRAPIWindowList_get__NewEnum(This,retval) (This)->lpVtbl->get__NewEnum(This,retval)
#define IRDPSRAPIWindowList_get_Item(This,item,pWindow) (This)->lpVtbl->get_Item(This,item,pWindow)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIWindowList_QueryInterface(IRDPSRAPIWindowList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIWindowList_AddRef(IRDPSRAPIWindowList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIWindowList_Release(IRDPSRAPIWindowList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPIWindowList_GetTypeInfoCount(IRDPSRAPIWindowList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPIWindowList_GetTypeInfo(IRDPSRAPIWindowList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPIWindowList_GetIDsOfNames(IRDPSRAPIWindowList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPIWindowList_Invoke(IRDPSRAPIWindowList* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPIWindowList methods ***/
static FORCEINLINE HRESULT IRDPSRAPIWindowList_get__NewEnum(IRDPSRAPIWindowList* This,IUnknown **retval) {
    return This->lpVtbl->get__NewEnum(This,retval);
}
static FORCEINLINE HRESULT IRDPSRAPIWindowList_get_Item(IRDPSRAPIWindowList* This,LONG item,IRDPSRAPIWindow **pWindow) {
    return This->lpVtbl->get_Item(This,item,pWindow);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIWindowList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPIApplication interface
 */
#ifndef __IRDPSRAPIApplication_INTERFACE_DEFINED__
#define __IRDPSRAPIApplication_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIApplication, 0x41e7a09d, 0xeb7a, 0x436e, 0x93,0x5d, 0x78,0x0c,0xa2,0x62,0x83,0x24);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("41e7a09d-eb7a-436e-935d-780ca2628324")
IRDPSRAPIApplication : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Windows(
        IRDPSRAPIWindowList **pWindowList) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Id(
        LONG *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Shared(
        VARIANT_BOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Shared(
        VARIANT_BOOL NewVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Flags(
        ULONG *pdwFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIApplication, 0x41e7a09d, 0xeb7a, 0x436e, 0x93,0x5d, 0x78,0x0c,0xa2,0x62,0x83,0x24)
#endif
#else
typedef struct IRDPSRAPIApplicationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPIApplication *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPIApplication *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPIApplication *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPIApplication *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPIApplication methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Windows)(
        IRDPSRAPIApplication *This,
        IRDPSRAPIWindowList **pWindowList);

    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IRDPSRAPIApplication *This,
        LONG *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_Shared)(
        IRDPSRAPIApplication *This,
        VARIANT_BOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *put_Shared)(
        IRDPSRAPIApplication *This,
        VARIANT_BOOL NewVal);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        IRDPSRAPIApplication *This,
        BSTR *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_Flags)(
        IRDPSRAPIApplication *This,
        ULONG *pdwFlags);

    END_INTERFACE
} IRDPSRAPIApplicationVtbl;

interface IRDPSRAPIApplication {
    CONST_VTBL IRDPSRAPIApplicationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIApplication_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIApplication_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIApplication_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPIApplication_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPIApplication_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPIApplication_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPIApplication_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPIApplication methods ***/
#define IRDPSRAPIApplication_get_Windows(This,pWindowList) (This)->lpVtbl->get_Windows(This,pWindowList)
#define IRDPSRAPIApplication_get_Id(This,pRetVal) (This)->lpVtbl->get_Id(This,pRetVal)
#define IRDPSRAPIApplication_get_Shared(This,pRetVal) (This)->lpVtbl->get_Shared(This,pRetVal)
#define IRDPSRAPIApplication_put_Shared(This,NewVal) (This)->lpVtbl->put_Shared(This,NewVal)
#define IRDPSRAPIApplication_get_Name(This,pRetVal) (This)->lpVtbl->get_Name(This,pRetVal)
#define IRDPSRAPIApplication_get_Flags(This,pdwFlags) (This)->lpVtbl->get_Flags(This,pdwFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIApplication_QueryInterface(IRDPSRAPIApplication* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIApplication_AddRef(IRDPSRAPIApplication* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIApplication_Release(IRDPSRAPIApplication* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPIApplication_GetTypeInfoCount(IRDPSRAPIApplication* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPIApplication_GetTypeInfo(IRDPSRAPIApplication* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPIApplication_GetIDsOfNames(IRDPSRAPIApplication* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPIApplication_Invoke(IRDPSRAPIApplication* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPIApplication methods ***/
static FORCEINLINE HRESULT IRDPSRAPIApplication_get_Windows(IRDPSRAPIApplication* This,IRDPSRAPIWindowList **pWindowList) {
    return This->lpVtbl->get_Windows(This,pWindowList);
}
static FORCEINLINE HRESULT IRDPSRAPIApplication_get_Id(IRDPSRAPIApplication* This,LONG *pRetVal) {
    return This->lpVtbl->get_Id(This,pRetVal);
}
static FORCEINLINE HRESULT IRDPSRAPIApplication_get_Shared(IRDPSRAPIApplication* This,VARIANT_BOOL *pRetVal) {
    return This->lpVtbl->get_Shared(This,pRetVal);
}
static FORCEINLINE HRESULT IRDPSRAPIApplication_put_Shared(IRDPSRAPIApplication* This,VARIANT_BOOL NewVal) {
    return This->lpVtbl->put_Shared(This,NewVal);
}
static FORCEINLINE HRESULT IRDPSRAPIApplication_get_Name(IRDPSRAPIApplication* This,BSTR *pRetVal) {
    return This->lpVtbl->get_Name(This,pRetVal);
}
static FORCEINLINE HRESULT IRDPSRAPIApplication_get_Flags(IRDPSRAPIApplication* This,ULONG *pdwFlags) {
    return This->lpVtbl->get_Flags(This,pdwFlags);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIApplication_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPIApplicationList interface
 */
#ifndef __IRDPSRAPIApplicationList_INTERFACE_DEFINED__
#define __IRDPSRAPIApplicationList_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIApplicationList, 0xd4b4aeb3, 0x22dc, 0x4837, 0xb3,0xb6, 0x42,0xea,0x25,0x17,0x84,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d4b4aeb3-22dc-4837-b3b6-42ea2517849a")
IRDPSRAPIApplicationList : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        LONG item,
        IRDPSRAPIApplication **pApplication) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIApplicationList, 0xd4b4aeb3, 0x22dc, 0x4837, 0xb3,0xb6, 0x42,0xea,0x25,0x17,0x84,0x9a)
#endif
#else
typedef struct IRDPSRAPIApplicationListVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPIApplicationList *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPIApplicationList *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPIApplicationList *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPIApplicationList *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPIApplicationList methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IRDPSRAPIApplicationList *This,
        IUnknown **retval);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IRDPSRAPIApplicationList *This,
        LONG item,
        IRDPSRAPIApplication **pApplication);

    END_INTERFACE
} IRDPSRAPIApplicationListVtbl;

interface IRDPSRAPIApplicationList {
    CONST_VTBL IRDPSRAPIApplicationListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIApplicationList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIApplicationList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIApplicationList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPIApplicationList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPIApplicationList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPIApplicationList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPIApplicationList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPIApplicationList methods ***/
#define IRDPSRAPIApplicationList_get__NewEnum(This,retval) (This)->lpVtbl->get__NewEnum(This,retval)
#define IRDPSRAPIApplicationList_get_Item(This,item,pApplication) (This)->lpVtbl->get_Item(This,item,pApplication)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIApplicationList_QueryInterface(IRDPSRAPIApplicationList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIApplicationList_AddRef(IRDPSRAPIApplicationList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIApplicationList_Release(IRDPSRAPIApplicationList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPIApplicationList_GetTypeInfoCount(IRDPSRAPIApplicationList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPIApplicationList_GetTypeInfo(IRDPSRAPIApplicationList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPIApplicationList_GetIDsOfNames(IRDPSRAPIApplicationList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPIApplicationList_Invoke(IRDPSRAPIApplicationList* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPIApplicationList methods ***/
static FORCEINLINE HRESULT IRDPSRAPIApplicationList_get__NewEnum(IRDPSRAPIApplicationList* This,IUnknown **retval) {
    return This->lpVtbl->get__NewEnum(This,retval);
}
static FORCEINLINE HRESULT IRDPSRAPIApplicationList_get_Item(IRDPSRAPIApplicationList* This,LONG item,IRDPSRAPIApplication **pApplication) {
    return This->lpVtbl->get_Item(This,item,pApplication);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIApplicationList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPIApplicationFilter interface
 */
#ifndef __IRDPSRAPIApplicationFilter_INTERFACE_DEFINED__
#define __IRDPSRAPIApplicationFilter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIApplicationFilter, 0xd20f10ca, 0x6637, 0x4f06, 0xb1,0xd5, 0x27,0x7e,0xa7,0xe5,0x16,0x0d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d20f10ca-6637-4f06-b1d5-277ea7e5160d")
IRDPSRAPIApplicationFilter : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Applications(
        IRDPSRAPIApplicationList **pApplications) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Windows(
        IRDPSRAPIWindowList **pWindows) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Enabled(
        VARIANT_BOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Enabled(
        VARIANT_BOOL NewVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIApplicationFilter, 0xd20f10ca, 0x6637, 0x4f06, 0xb1,0xd5, 0x27,0x7e,0xa7,0xe5,0x16,0x0d)
#endif
#else
typedef struct IRDPSRAPIApplicationFilterVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPIApplicationFilter *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPIApplicationFilter *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPIApplicationFilter *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPIApplicationFilter *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPIApplicationFilter methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Applications)(
        IRDPSRAPIApplicationFilter *This,
        IRDPSRAPIApplicationList **pApplications);

    HRESULT (STDMETHODCALLTYPE *get_Windows)(
        IRDPSRAPIApplicationFilter *This,
        IRDPSRAPIWindowList **pWindows);

    HRESULT (STDMETHODCALLTYPE *get_Enabled)(
        IRDPSRAPIApplicationFilter *This,
        VARIANT_BOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *put_Enabled)(
        IRDPSRAPIApplicationFilter *This,
        VARIANT_BOOL NewVal);

    END_INTERFACE
} IRDPSRAPIApplicationFilterVtbl;

interface IRDPSRAPIApplicationFilter {
    CONST_VTBL IRDPSRAPIApplicationFilterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIApplicationFilter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIApplicationFilter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIApplicationFilter_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPIApplicationFilter_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPIApplicationFilter_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPIApplicationFilter_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPIApplicationFilter_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPIApplicationFilter methods ***/
#define IRDPSRAPIApplicationFilter_get_Applications(This,pApplications) (This)->lpVtbl->get_Applications(This,pApplications)
#define IRDPSRAPIApplicationFilter_get_Windows(This,pWindows) (This)->lpVtbl->get_Windows(This,pWindows)
#define IRDPSRAPIApplicationFilter_get_Enabled(This,pRetVal) (This)->lpVtbl->get_Enabled(This,pRetVal)
#define IRDPSRAPIApplicationFilter_put_Enabled(This,NewVal) (This)->lpVtbl->put_Enabled(This,NewVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIApplicationFilter_QueryInterface(IRDPSRAPIApplicationFilter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIApplicationFilter_AddRef(IRDPSRAPIApplicationFilter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIApplicationFilter_Release(IRDPSRAPIApplicationFilter* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPIApplicationFilter_GetTypeInfoCount(IRDPSRAPIApplicationFilter* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPIApplicationFilter_GetTypeInfo(IRDPSRAPIApplicationFilter* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPIApplicationFilter_GetIDsOfNames(IRDPSRAPIApplicationFilter* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPIApplicationFilter_Invoke(IRDPSRAPIApplicationFilter* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPIApplicationFilter methods ***/
static FORCEINLINE HRESULT IRDPSRAPIApplicationFilter_get_Applications(IRDPSRAPIApplicationFilter* This,IRDPSRAPIApplicationList **pApplications) {
    return This->lpVtbl->get_Applications(This,pApplications);
}
static FORCEINLINE HRESULT IRDPSRAPIApplicationFilter_get_Windows(IRDPSRAPIApplicationFilter* This,IRDPSRAPIWindowList **pWindows) {
    return This->lpVtbl->get_Windows(This,pWindows);
}
static FORCEINLINE HRESULT IRDPSRAPIApplicationFilter_get_Enabled(IRDPSRAPIApplicationFilter* This,VARIANT_BOOL *pRetVal) {
    return This->lpVtbl->get_Enabled(This,pRetVal);
}
static FORCEINLINE HRESULT IRDPSRAPIApplicationFilter_put_Enabled(IRDPSRAPIApplicationFilter* This,VARIANT_BOOL NewVal) {
    return This->lpVtbl->put_Enabled(This,NewVal);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIApplicationFilter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPISessionProperties interface
 */
#ifndef __IRDPSRAPISessionProperties_INTERFACE_DEFINED__
#define __IRDPSRAPISessionProperties_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPISessionProperties, 0x339b24f2, 0x9bc0, 0x4f16, 0x9a,0xac, 0xf1,0x65,0x43,0x3d,0x13,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("339b24f2-9bc0-4f16-9aac-f165433d13d4")
IRDPSRAPISessionProperties : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Property(
        BSTR PropertyName,
        VARIANT *pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Property(
        BSTR PropertyName,
        VARIANT newVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPISessionProperties, 0x339b24f2, 0x9bc0, 0x4f16, 0x9a,0xac, 0xf1,0x65,0x43,0x3d,0x13,0xd4)
#endif
#else
typedef struct IRDPSRAPISessionPropertiesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPISessionProperties *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPISessionProperties *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPISessionProperties *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPISessionProperties *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPISessionProperties methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Property)(
        IRDPSRAPISessionProperties *This,
        BSTR PropertyName,
        VARIANT *pVal);

    HRESULT (STDMETHODCALLTYPE *put_Property)(
        IRDPSRAPISessionProperties *This,
        BSTR PropertyName,
        VARIANT newVal);

    END_INTERFACE
} IRDPSRAPISessionPropertiesVtbl;

interface IRDPSRAPISessionProperties {
    CONST_VTBL IRDPSRAPISessionPropertiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPISessionProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPISessionProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPISessionProperties_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPISessionProperties_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPISessionProperties_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPISessionProperties_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPISessionProperties_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPISessionProperties methods ***/
#define IRDPSRAPISessionProperties_get_Property(This,PropertyName,pVal) (This)->lpVtbl->get_Property(This,PropertyName,pVal)
#define IRDPSRAPISessionProperties_put_Property(This,PropertyName,newVal) (This)->lpVtbl->put_Property(This,PropertyName,newVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPISessionProperties_QueryInterface(IRDPSRAPISessionProperties* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPISessionProperties_AddRef(IRDPSRAPISessionProperties* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPISessionProperties_Release(IRDPSRAPISessionProperties* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPISessionProperties_GetTypeInfoCount(IRDPSRAPISessionProperties* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPISessionProperties_GetTypeInfo(IRDPSRAPISessionProperties* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPISessionProperties_GetIDsOfNames(IRDPSRAPISessionProperties* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPISessionProperties_Invoke(IRDPSRAPISessionProperties* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPISessionProperties methods ***/
static FORCEINLINE HRESULT IRDPSRAPISessionProperties_get_Property(IRDPSRAPISessionProperties* This,BSTR PropertyName,VARIANT *pVal) {
    return This->lpVtbl->get_Property(This,PropertyName,pVal);
}
static FORCEINLINE HRESULT IRDPSRAPISessionProperties_put_Property(IRDPSRAPISessionProperties* This,BSTR PropertyName,VARIANT newVal) {
    return This->lpVtbl->put_Property(This,PropertyName,newVal);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPISessionProperties_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPIInvitation interface
 */
#ifndef __IRDPSRAPIInvitation_INTERFACE_DEFINED__
#define __IRDPSRAPIInvitation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIInvitation, 0x4fac1d43, 0xfc51, 0x45bb, 0xb1,0xb4, 0x2b,0x53,0xaa,0x56,0x2f,0xa3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4fac1d43-fc51-45bb-b1b4-2b53aa562fa3")
IRDPSRAPIInvitation : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_ConnectionString(
        BSTR *pbstrVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_GroupName(
        BSTR *pbstrVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Password(
        BSTR *pbstrVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AttendeeLimit(
        LONG *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_AttendeeLimit(
        LONG NewVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Revoked(
        VARIANT_BOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Revoked(
        VARIANT_BOOL NewVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIInvitation, 0x4fac1d43, 0xfc51, 0x45bb, 0xb1,0xb4, 0x2b,0x53,0xaa,0x56,0x2f,0xa3)
#endif
#else
typedef struct IRDPSRAPIInvitationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPIInvitation *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPIInvitation *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPIInvitation *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPIInvitation *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPIInvitation methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ConnectionString)(
        IRDPSRAPIInvitation *This,
        BSTR *pbstrVal);

    HRESULT (STDMETHODCALLTYPE *get_GroupName)(
        IRDPSRAPIInvitation *This,
        BSTR *pbstrVal);

    HRESULT (STDMETHODCALLTYPE *get_Password)(
        IRDPSRAPIInvitation *This,
        BSTR *pbstrVal);

    HRESULT (STDMETHODCALLTYPE *get_AttendeeLimit)(
        IRDPSRAPIInvitation *This,
        LONG *pRetVal);

    HRESULT (STDMETHODCALLTYPE *put_AttendeeLimit)(
        IRDPSRAPIInvitation *This,
        LONG NewVal);

    HRESULT (STDMETHODCALLTYPE *get_Revoked)(
        IRDPSRAPIInvitation *This,
        VARIANT_BOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *put_Revoked)(
        IRDPSRAPIInvitation *This,
        VARIANT_BOOL NewVal);

    END_INTERFACE
} IRDPSRAPIInvitationVtbl;

interface IRDPSRAPIInvitation {
    CONST_VTBL IRDPSRAPIInvitationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIInvitation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIInvitation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIInvitation_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPIInvitation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPIInvitation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPIInvitation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPIInvitation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPIInvitation methods ***/
#define IRDPSRAPIInvitation_get_ConnectionString(This,pbstrVal) (This)->lpVtbl->get_ConnectionString(This,pbstrVal)
#define IRDPSRAPIInvitation_get_GroupName(This,pbstrVal) (This)->lpVtbl->get_GroupName(This,pbstrVal)
#define IRDPSRAPIInvitation_get_Password(This,pbstrVal) (This)->lpVtbl->get_Password(This,pbstrVal)
#define IRDPSRAPIInvitation_get_AttendeeLimit(This,pRetVal) (This)->lpVtbl->get_AttendeeLimit(This,pRetVal)
#define IRDPSRAPIInvitation_put_AttendeeLimit(This,NewVal) (This)->lpVtbl->put_AttendeeLimit(This,NewVal)
#define IRDPSRAPIInvitation_get_Revoked(This,pRetVal) (This)->lpVtbl->get_Revoked(This,pRetVal)
#define IRDPSRAPIInvitation_put_Revoked(This,NewVal) (This)->lpVtbl->put_Revoked(This,NewVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIInvitation_QueryInterface(IRDPSRAPIInvitation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIInvitation_AddRef(IRDPSRAPIInvitation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIInvitation_Release(IRDPSRAPIInvitation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPIInvitation_GetTypeInfoCount(IRDPSRAPIInvitation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPIInvitation_GetTypeInfo(IRDPSRAPIInvitation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPIInvitation_GetIDsOfNames(IRDPSRAPIInvitation* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPIInvitation_Invoke(IRDPSRAPIInvitation* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPIInvitation methods ***/
static FORCEINLINE HRESULT IRDPSRAPIInvitation_get_ConnectionString(IRDPSRAPIInvitation* This,BSTR *pbstrVal) {
    return This->lpVtbl->get_ConnectionString(This,pbstrVal);
}
static FORCEINLINE HRESULT IRDPSRAPIInvitation_get_GroupName(IRDPSRAPIInvitation* This,BSTR *pbstrVal) {
    return This->lpVtbl->get_GroupName(This,pbstrVal);
}
static FORCEINLINE HRESULT IRDPSRAPIInvitation_get_Password(IRDPSRAPIInvitation* This,BSTR *pbstrVal) {
    return This->lpVtbl->get_Password(This,pbstrVal);
}
static FORCEINLINE HRESULT IRDPSRAPIInvitation_get_AttendeeLimit(IRDPSRAPIInvitation* This,LONG *pRetVal) {
    return This->lpVtbl->get_AttendeeLimit(This,pRetVal);
}
static FORCEINLINE HRESULT IRDPSRAPIInvitation_put_AttendeeLimit(IRDPSRAPIInvitation* This,LONG NewVal) {
    return This->lpVtbl->put_AttendeeLimit(This,NewVal);
}
static FORCEINLINE HRESULT IRDPSRAPIInvitation_get_Revoked(IRDPSRAPIInvitation* This,VARIANT_BOOL *pRetVal) {
    return This->lpVtbl->get_Revoked(This,pRetVal);
}
static FORCEINLINE HRESULT IRDPSRAPIInvitation_put_Revoked(IRDPSRAPIInvitation* This,VARIANT_BOOL NewVal) {
    return This->lpVtbl->put_Revoked(This,NewVal);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIInvitation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPIInvitationManager interface
 */
#ifndef __IRDPSRAPIInvitationManager_INTERFACE_DEFINED__
#define __IRDPSRAPIInvitationManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIInvitationManager, 0x4722b049, 0x92c3, 0x4c2d, 0x8a,0x65, 0xf7,0x34,0x8f,0x64,0x4d,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4722b049-92c3-4c2d-8a65-f7348f644dcf")
IRDPSRAPIInvitationManager : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        VARIANT item,
        IRDPSRAPIInvitation **ppInvitation) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateInvitation(
        BSTR bstrAuthString,
        BSTR bstrGroupName,
        BSTR bstrPassword,
        LONG AttendeeLimit,
        IRDPSRAPIInvitation **ppInvitation) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIInvitationManager, 0x4722b049, 0x92c3, 0x4c2d, 0x8a,0x65, 0xf7,0x34,0x8f,0x64,0x4d,0xcf)
#endif
#else
typedef struct IRDPSRAPIInvitationManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPIInvitationManager *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPIInvitationManager *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPIInvitationManager *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPIInvitationManager *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPIInvitationManager methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IRDPSRAPIInvitationManager *This,
        IUnknown **retval);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IRDPSRAPIInvitationManager *This,
        VARIANT item,
        IRDPSRAPIInvitation **ppInvitation);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IRDPSRAPIInvitationManager *This,
        LONG *pRetVal);

    HRESULT (STDMETHODCALLTYPE *CreateInvitation)(
        IRDPSRAPIInvitationManager *This,
        BSTR bstrAuthString,
        BSTR bstrGroupName,
        BSTR bstrPassword,
        LONG AttendeeLimit,
        IRDPSRAPIInvitation **ppInvitation);

    END_INTERFACE
} IRDPSRAPIInvitationManagerVtbl;

interface IRDPSRAPIInvitationManager {
    CONST_VTBL IRDPSRAPIInvitationManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIInvitationManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIInvitationManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIInvitationManager_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPIInvitationManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPIInvitationManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPIInvitationManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPIInvitationManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPIInvitationManager methods ***/
#define IRDPSRAPIInvitationManager_get__NewEnum(This,retval) (This)->lpVtbl->get__NewEnum(This,retval)
#define IRDPSRAPIInvitationManager_get_Item(This,item,ppInvitation) (This)->lpVtbl->get_Item(This,item,ppInvitation)
#define IRDPSRAPIInvitationManager_get_Count(This,pRetVal) (This)->lpVtbl->get_Count(This,pRetVal)
#define IRDPSRAPIInvitationManager_CreateInvitation(This,bstrAuthString,bstrGroupName,bstrPassword,AttendeeLimit,ppInvitation) (This)->lpVtbl->CreateInvitation(This,bstrAuthString,bstrGroupName,bstrPassword,AttendeeLimit,ppInvitation)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIInvitationManager_QueryInterface(IRDPSRAPIInvitationManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIInvitationManager_AddRef(IRDPSRAPIInvitationManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIInvitationManager_Release(IRDPSRAPIInvitationManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPIInvitationManager_GetTypeInfoCount(IRDPSRAPIInvitationManager* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPIInvitationManager_GetTypeInfo(IRDPSRAPIInvitationManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPIInvitationManager_GetIDsOfNames(IRDPSRAPIInvitationManager* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPIInvitationManager_Invoke(IRDPSRAPIInvitationManager* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPIInvitationManager methods ***/
static FORCEINLINE HRESULT IRDPSRAPIInvitationManager_get__NewEnum(IRDPSRAPIInvitationManager* This,IUnknown **retval) {
    return This->lpVtbl->get__NewEnum(This,retval);
}
static FORCEINLINE HRESULT IRDPSRAPIInvitationManager_get_Item(IRDPSRAPIInvitationManager* This,VARIANT item,IRDPSRAPIInvitation **ppInvitation) {
    return This->lpVtbl->get_Item(This,item,ppInvitation);
}
static FORCEINLINE HRESULT IRDPSRAPIInvitationManager_get_Count(IRDPSRAPIInvitationManager* This,LONG *pRetVal) {
    return This->lpVtbl->get_Count(This,pRetVal);
}
static FORCEINLINE HRESULT IRDPSRAPIInvitationManager_CreateInvitation(IRDPSRAPIInvitationManager* This,BSTR bstrAuthString,BSTR bstrGroupName,BSTR bstrPassword,LONG AttendeeLimit,IRDPSRAPIInvitation **ppInvitation) {
    return This->lpVtbl->CreateInvitation(This,bstrAuthString,bstrGroupName,bstrPassword,AttendeeLimit,ppInvitation);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIInvitationManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPITcpConnectionInfo interface
 */
#ifndef __IRDPSRAPITcpConnectionInfo_INTERFACE_DEFINED__
#define __IRDPSRAPITcpConnectionInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPITcpConnectionInfo, 0xf74049a4, 0x3d06, 0x4028, 0x81,0x93, 0x0a,0x8c,0x29,0xbc,0x24,0x52);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f74049a4-3d06-4028-8193-0a8c29bc2452")
IRDPSRAPITcpConnectionInfo : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Protocol(
        LONG *plProtocol) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LocalPort(
        LONG *plPort) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LocalIP(
        BSTR *pbsrLocalIP) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PeerPort(
        LONG *plPort) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PeerIP(
        BSTR *pbstrIP) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPITcpConnectionInfo, 0xf74049a4, 0x3d06, 0x4028, 0x81,0x93, 0x0a,0x8c,0x29,0xbc,0x24,0x52)
#endif
#else
typedef struct IRDPSRAPITcpConnectionInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPITcpConnectionInfo *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPITcpConnectionInfo *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPITcpConnectionInfo *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPITcpConnectionInfo *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPITcpConnectionInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Protocol)(
        IRDPSRAPITcpConnectionInfo *This,
        LONG *plProtocol);

    HRESULT (STDMETHODCALLTYPE *get_LocalPort)(
        IRDPSRAPITcpConnectionInfo *This,
        LONG *plPort);

    HRESULT (STDMETHODCALLTYPE *get_LocalIP)(
        IRDPSRAPITcpConnectionInfo *This,
        BSTR *pbsrLocalIP);

    HRESULT (STDMETHODCALLTYPE *get_PeerPort)(
        IRDPSRAPITcpConnectionInfo *This,
        LONG *plPort);

    HRESULT (STDMETHODCALLTYPE *get_PeerIP)(
        IRDPSRAPITcpConnectionInfo *This,
        BSTR *pbstrIP);

    END_INTERFACE
} IRDPSRAPITcpConnectionInfoVtbl;

interface IRDPSRAPITcpConnectionInfo {
    CONST_VTBL IRDPSRAPITcpConnectionInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPITcpConnectionInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPITcpConnectionInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPITcpConnectionInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPITcpConnectionInfo_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPITcpConnectionInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPITcpConnectionInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPITcpConnectionInfo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPITcpConnectionInfo methods ***/
#define IRDPSRAPITcpConnectionInfo_get_Protocol(This,plProtocol) (This)->lpVtbl->get_Protocol(This,plProtocol)
#define IRDPSRAPITcpConnectionInfo_get_LocalPort(This,plPort) (This)->lpVtbl->get_LocalPort(This,plPort)
#define IRDPSRAPITcpConnectionInfo_get_LocalIP(This,pbsrLocalIP) (This)->lpVtbl->get_LocalIP(This,pbsrLocalIP)
#define IRDPSRAPITcpConnectionInfo_get_PeerPort(This,plPort) (This)->lpVtbl->get_PeerPort(This,plPort)
#define IRDPSRAPITcpConnectionInfo_get_PeerIP(This,pbstrIP) (This)->lpVtbl->get_PeerIP(This,pbstrIP)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPITcpConnectionInfo_QueryInterface(IRDPSRAPITcpConnectionInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPITcpConnectionInfo_AddRef(IRDPSRAPITcpConnectionInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPITcpConnectionInfo_Release(IRDPSRAPITcpConnectionInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPITcpConnectionInfo_GetTypeInfoCount(IRDPSRAPITcpConnectionInfo* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPITcpConnectionInfo_GetTypeInfo(IRDPSRAPITcpConnectionInfo* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPITcpConnectionInfo_GetIDsOfNames(IRDPSRAPITcpConnectionInfo* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPITcpConnectionInfo_Invoke(IRDPSRAPITcpConnectionInfo* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPITcpConnectionInfo methods ***/
static FORCEINLINE HRESULT IRDPSRAPITcpConnectionInfo_get_Protocol(IRDPSRAPITcpConnectionInfo* This,LONG *plProtocol) {
    return This->lpVtbl->get_Protocol(This,plProtocol);
}
static FORCEINLINE HRESULT IRDPSRAPITcpConnectionInfo_get_LocalPort(IRDPSRAPITcpConnectionInfo* This,LONG *plPort) {
    return This->lpVtbl->get_LocalPort(This,plPort);
}
static FORCEINLINE HRESULT IRDPSRAPITcpConnectionInfo_get_LocalIP(IRDPSRAPITcpConnectionInfo* This,BSTR *pbsrLocalIP) {
    return This->lpVtbl->get_LocalIP(This,pbsrLocalIP);
}
static FORCEINLINE HRESULT IRDPSRAPITcpConnectionInfo_get_PeerPort(IRDPSRAPITcpConnectionInfo* This,LONG *plPort) {
    return This->lpVtbl->get_PeerPort(This,plPort);
}
static FORCEINLINE HRESULT IRDPSRAPITcpConnectionInfo_get_PeerIP(IRDPSRAPITcpConnectionInfo* This,BSTR *pbstrIP) {
    return This->lpVtbl->get_PeerIP(This,pbstrIP);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPITcpConnectionInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPIAttendee interface
 */
#ifndef __IRDPSRAPIAttendee_INTERFACE_DEFINED__
#define __IRDPSRAPIAttendee_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIAttendee, 0xec0671b3, 0x1b78, 0x4b80, 0xa4,0x64, 0x91,0x32,0x24,0x75,0x43,0xe3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ec0671b3-1b78-4b80-a464-9132247543e3")
IRDPSRAPIAttendee : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Id(
        LONG *pId) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RemoteName(
        BSTR *pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ControlLevel(
        CTRL_LEVEL *pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ControlLevel(
        CTRL_LEVEL pNewVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Invitation(
        IRDPSRAPIInvitation **ppVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE TerminateConnection(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Flags(
        LONG *plFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ConnectivityInfo(
        IUnknown **ppVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIAttendee, 0xec0671b3, 0x1b78, 0x4b80, 0xa4,0x64, 0x91,0x32,0x24,0x75,0x43,0xe3)
#endif
#else
typedef struct IRDPSRAPIAttendeeVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPIAttendee *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPIAttendee *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPIAttendee *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPIAttendee *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPIAttendee methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IRDPSRAPIAttendee *This,
        LONG *pId);

    HRESULT (STDMETHODCALLTYPE *get_RemoteName)(
        IRDPSRAPIAttendee *This,
        BSTR *pVal);

    HRESULT (STDMETHODCALLTYPE *get_ControlLevel)(
        IRDPSRAPIAttendee *This,
        CTRL_LEVEL *pVal);

    HRESULT (STDMETHODCALLTYPE *put_ControlLevel)(
        IRDPSRAPIAttendee *This,
        CTRL_LEVEL pNewVal);

    HRESULT (STDMETHODCALLTYPE *get_Invitation)(
        IRDPSRAPIAttendee *This,
        IRDPSRAPIInvitation **ppVal);

    HRESULT (STDMETHODCALLTYPE *TerminateConnection)(
        IRDPSRAPIAttendee *This);

    HRESULT (STDMETHODCALLTYPE *get_Flags)(
        IRDPSRAPIAttendee *This,
        LONG *plFlags);

    HRESULT (STDMETHODCALLTYPE *get_ConnectivityInfo)(
        IRDPSRAPIAttendee *This,
        IUnknown **ppVal);

    END_INTERFACE
} IRDPSRAPIAttendeeVtbl;

interface IRDPSRAPIAttendee {
    CONST_VTBL IRDPSRAPIAttendeeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIAttendee_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIAttendee_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIAttendee_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPIAttendee_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPIAttendee_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPIAttendee_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPIAttendee_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPIAttendee methods ***/
#define IRDPSRAPIAttendee_get_Id(This,pId) (This)->lpVtbl->get_Id(This,pId)
#define IRDPSRAPIAttendee_get_RemoteName(This,pVal) (This)->lpVtbl->get_RemoteName(This,pVal)
#define IRDPSRAPIAttendee_get_ControlLevel(This,pVal) (This)->lpVtbl->get_ControlLevel(This,pVal)
#define IRDPSRAPIAttendee_put_ControlLevel(This,pNewVal) (This)->lpVtbl->put_ControlLevel(This,pNewVal)
#define IRDPSRAPIAttendee_get_Invitation(This,ppVal) (This)->lpVtbl->get_Invitation(This,ppVal)
#define IRDPSRAPIAttendee_TerminateConnection(This) (This)->lpVtbl->TerminateConnection(This)
#define IRDPSRAPIAttendee_get_Flags(This,plFlags) (This)->lpVtbl->get_Flags(This,plFlags)
#define IRDPSRAPIAttendee_get_ConnectivityInfo(This,ppVal) (This)->lpVtbl->get_ConnectivityInfo(This,ppVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIAttendee_QueryInterface(IRDPSRAPIAttendee* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIAttendee_AddRef(IRDPSRAPIAttendee* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIAttendee_Release(IRDPSRAPIAttendee* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPIAttendee_GetTypeInfoCount(IRDPSRAPIAttendee* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendee_GetTypeInfo(IRDPSRAPIAttendee* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendee_GetIDsOfNames(IRDPSRAPIAttendee* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendee_Invoke(IRDPSRAPIAttendee* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPIAttendee methods ***/
static FORCEINLINE HRESULT IRDPSRAPIAttendee_get_Id(IRDPSRAPIAttendee* This,LONG *pId) {
    return This->lpVtbl->get_Id(This,pId);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendee_get_RemoteName(IRDPSRAPIAttendee* This,BSTR *pVal) {
    return This->lpVtbl->get_RemoteName(This,pVal);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendee_get_ControlLevel(IRDPSRAPIAttendee* This,CTRL_LEVEL *pVal) {
    return This->lpVtbl->get_ControlLevel(This,pVal);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendee_put_ControlLevel(IRDPSRAPIAttendee* This,CTRL_LEVEL pNewVal) {
    return This->lpVtbl->put_ControlLevel(This,pNewVal);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendee_get_Invitation(IRDPSRAPIAttendee* This,IRDPSRAPIInvitation **ppVal) {
    return This->lpVtbl->get_Invitation(This,ppVal);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendee_TerminateConnection(IRDPSRAPIAttendee* This) {
    return This->lpVtbl->TerminateConnection(This);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendee_get_Flags(IRDPSRAPIAttendee* This,LONG *plFlags) {
    return This->lpVtbl->get_Flags(This,plFlags);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendee_get_ConnectivityInfo(IRDPSRAPIAttendee* This,IUnknown **ppVal) {
    return This->lpVtbl->get_ConnectivityInfo(This,ppVal);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIAttendee_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPIAttendeeManager interface
 */
#ifndef __IRDPSRAPIAttendeeManager_INTERFACE_DEFINED__
#define __IRDPSRAPIAttendeeManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIAttendeeManager, 0xba3a37e8, 0x33da, 0x4749, 0x8d,0xa0, 0x07,0xfa,0x34,0xda,0x79,0x44);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ba3a37e8-33da-4749-8da0-07fa34da7944")
IRDPSRAPIAttendeeManager : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        LONG id,
        IRDPSRAPIAttendee **ppItem) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIAttendeeManager, 0xba3a37e8, 0x33da, 0x4749, 0x8d,0xa0, 0x07,0xfa,0x34,0xda,0x79,0x44)
#endif
#else
typedef struct IRDPSRAPIAttendeeManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPIAttendeeManager *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPIAttendeeManager *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPIAttendeeManager *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPIAttendeeManager *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPIAttendeeManager methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IRDPSRAPIAttendeeManager *This,
        IUnknown **retval);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IRDPSRAPIAttendeeManager *This,
        LONG id,
        IRDPSRAPIAttendee **ppItem);

    END_INTERFACE
} IRDPSRAPIAttendeeManagerVtbl;

interface IRDPSRAPIAttendeeManager {
    CONST_VTBL IRDPSRAPIAttendeeManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIAttendeeManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIAttendeeManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIAttendeeManager_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPIAttendeeManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPIAttendeeManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPIAttendeeManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPIAttendeeManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPIAttendeeManager methods ***/
#define IRDPSRAPIAttendeeManager_get__NewEnum(This,retval) (This)->lpVtbl->get__NewEnum(This,retval)
#define IRDPSRAPIAttendeeManager_get_Item(This,id,ppItem) (This)->lpVtbl->get_Item(This,id,ppItem)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIAttendeeManager_QueryInterface(IRDPSRAPIAttendeeManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIAttendeeManager_AddRef(IRDPSRAPIAttendeeManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIAttendeeManager_Release(IRDPSRAPIAttendeeManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPIAttendeeManager_GetTypeInfoCount(IRDPSRAPIAttendeeManager* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendeeManager_GetTypeInfo(IRDPSRAPIAttendeeManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendeeManager_GetIDsOfNames(IRDPSRAPIAttendeeManager* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendeeManager_Invoke(IRDPSRAPIAttendeeManager* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPIAttendeeManager methods ***/
static FORCEINLINE HRESULT IRDPSRAPIAttendeeManager_get__NewEnum(IRDPSRAPIAttendeeManager* This,IUnknown **retval) {
    return This->lpVtbl->get__NewEnum(This,retval);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendeeManager_get_Item(IRDPSRAPIAttendeeManager* This,LONG id,IRDPSRAPIAttendee **ppItem) {
    return This->lpVtbl->get_Item(This,id,ppItem);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIAttendeeManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPIAttendeeDisconnectInfo interface
 */
#ifndef __IRDPSRAPIAttendeeDisconnectInfo_INTERFACE_DEFINED__
#define __IRDPSRAPIAttendeeDisconnectInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIAttendeeDisconnectInfo, 0xc187689f, 0x447c, 0x44a1, 0x9c,0x14, 0xff,0xfb,0xb3,0xb7,0xec,0x17);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c187689f-447c-44a1-9c14-fffbb3b7ec17")
IRDPSRAPIAttendeeDisconnectInfo : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Attendee(
        IRDPSRAPIAttendee **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Reason(
        ATTENDEE_DISCONNECT_REASON *pReason) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Code(
        LONG *pVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIAttendeeDisconnectInfo, 0xc187689f, 0x447c, 0x44a1, 0x9c,0x14, 0xff,0xfb,0xb3,0xb7,0xec,0x17)
#endif
#else
typedef struct IRDPSRAPIAttendeeDisconnectInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPIAttendeeDisconnectInfo *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPIAttendeeDisconnectInfo *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPIAttendeeDisconnectInfo *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPIAttendeeDisconnectInfo *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPIAttendeeDisconnectInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Attendee)(
        IRDPSRAPIAttendeeDisconnectInfo *This,
        IRDPSRAPIAttendee **retval);

    HRESULT (STDMETHODCALLTYPE *get_Reason)(
        IRDPSRAPIAttendeeDisconnectInfo *This,
        ATTENDEE_DISCONNECT_REASON *pReason);

    HRESULT (STDMETHODCALLTYPE *get_Code)(
        IRDPSRAPIAttendeeDisconnectInfo *This,
        LONG *pVal);

    END_INTERFACE
} IRDPSRAPIAttendeeDisconnectInfoVtbl;

interface IRDPSRAPIAttendeeDisconnectInfo {
    CONST_VTBL IRDPSRAPIAttendeeDisconnectInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIAttendeeDisconnectInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIAttendeeDisconnectInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIAttendeeDisconnectInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPIAttendeeDisconnectInfo_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPIAttendeeDisconnectInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPIAttendeeDisconnectInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPIAttendeeDisconnectInfo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPIAttendeeDisconnectInfo methods ***/
#define IRDPSRAPIAttendeeDisconnectInfo_get_Attendee(This,retval) (This)->lpVtbl->get_Attendee(This,retval)
#define IRDPSRAPIAttendeeDisconnectInfo_get_Reason(This,pReason) (This)->lpVtbl->get_Reason(This,pReason)
#define IRDPSRAPIAttendeeDisconnectInfo_get_Code(This,pVal) (This)->lpVtbl->get_Code(This,pVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIAttendeeDisconnectInfo_QueryInterface(IRDPSRAPIAttendeeDisconnectInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIAttendeeDisconnectInfo_AddRef(IRDPSRAPIAttendeeDisconnectInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIAttendeeDisconnectInfo_Release(IRDPSRAPIAttendeeDisconnectInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPIAttendeeDisconnectInfo_GetTypeInfoCount(IRDPSRAPIAttendeeDisconnectInfo* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendeeDisconnectInfo_GetTypeInfo(IRDPSRAPIAttendeeDisconnectInfo* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendeeDisconnectInfo_GetIDsOfNames(IRDPSRAPIAttendeeDisconnectInfo* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendeeDisconnectInfo_Invoke(IRDPSRAPIAttendeeDisconnectInfo* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPIAttendeeDisconnectInfo methods ***/
static FORCEINLINE HRESULT IRDPSRAPIAttendeeDisconnectInfo_get_Attendee(IRDPSRAPIAttendeeDisconnectInfo* This,IRDPSRAPIAttendee **retval) {
    return This->lpVtbl->get_Attendee(This,retval);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendeeDisconnectInfo_get_Reason(IRDPSRAPIAttendeeDisconnectInfo* This,ATTENDEE_DISCONNECT_REASON *pReason) {
    return This->lpVtbl->get_Reason(This,pReason);
}
static FORCEINLINE HRESULT IRDPSRAPIAttendeeDisconnectInfo_get_Code(IRDPSRAPIAttendeeDisconnectInfo* This,LONG *pVal) {
    return This->lpVtbl->get_Code(This,pVal);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIAttendeeDisconnectInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPIVirtualChannel interface
 */
#ifndef __IRDPSRAPIVirtualChannel_INTERFACE_DEFINED__
#define __IRDPSRAPIVirtualChannel_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIVirtualChannel, 0x05e12f95, 0x28b3, 0x4c9a, 0x87,0x80, 0xd0,0x24,0x85,0x74,0xa1,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("05e12f95-28b3-4c9a-8780-d0248574a1e0")
IRDPSRAPIVirtualChannel : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE SendData(
        BSTR bstrData,
        LONG lAttendeeId,
        ULONG ChannelSendFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAccess(
        LONG lAttendeeId,
        CHANNEL_ACCESS_ENUM AccessType) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *pbstrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Flags(
        LONG *plFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Priority(
        CHANNEL_PRIORITY *pPriority) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIVirtualChannel, 0x05e12f95, 0x28b3, 0x4c9a, 0x87,0x80, 0xd0,0x24,0x85,0x74,0xa1,0xe0)
#endif
#else
typedef struct IRDPSRAPIVirtualChannelVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPIVirtualChannel *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPIVirtualChannel *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPIVirtualChannel *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPIVirtualChannel *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPIVirtualChannel methods ***/
    HRESULT (STDMETHODCALLTYPE *SendData)(
        IRDPSRAPIVirtualChannel *This,
        BSTR bstrData,
        LONG lAttendeeId,
        ULONG ChannelSendFlags);

    HRESULT (STDMETHODCALLTYPE *SetAccess)(
        IRDPSRAPIVirtualChannel *This,
        LONG lAttendeeId,
        CHANNEL_ACCESS_ENUM AccessType);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        IRDPSRAPIVirtualChannel *This,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *get_Flags)(
        IRDPSRAPIVirtualChannel *This,
        LONG *plFlags);

    HRESULT (STDMETHODCALLTYPE *get_Priority)(
        IRDPSRAPIVirtualChannel *This,
        CHANNEL_PRIORITY *pPriority);

    END_INTERFACE
} IRDPSRAPIVirtualChannelVtbl;

interface IRDPSRAPIVirtualChannel {
    CONST_VTBL IRDPSRAPIVirtualChannelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIVirtualChannel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIVirtualChannel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIVirtualChannel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPIVirtualChannel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPIVirtualChannel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPIVirtualChannel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPIVirtualChannel_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPIVirtualChannel methods ***/
#define IRDPSRAPIVirtualChannel_SendData(This,bstrData,lAttendeeId,ChannelSendFlags) (This)->lpVtbl->SendData(This,bstrData,lAttendeeId,ChannelSendFlags)
#define IRDPSRAPIVirtualChannel_SetAccess(This,lAttendeeId,AccessType) (This)->lpVtbl->SetAccess(This,lAttendeeId,AccessType)
#define IRDPSRAPIVirtualChannel_get_Name(This,pbstrName) (This)->lpVtbl->get_Name(This,pbstrName)
#define IRDPSRAPIVirtualChannel_get_Flags(This,plFlags) (This)->lpVtbl->get_Flags(This,plFlags)
#define IRDPSRAPIVirtualChannel_get_Priority(This,pPriority) (This)->lpVtbl->get_Priority(This,pPriority)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannel_QueryInterface(IRDPSRAPIVirtualChannel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIVirtualChannel_AddRef(IRDPSRAPIVirtualChannel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIVirtualChannel_Release(IRDPSRAPIVirtualChannel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannel_GetTypeInfoCount(IRDPSRAPIVirtualChannel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannel_GetTypeInfo(IRDPSRAPIVirtualChannel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannel_GetIDsOfNames(IRDPSRAPIVirtualChannel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannel_Invoke(IRDPSRAPIVirtualChannel* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPIVirtualChannel methods ***/
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannel_SendData(IRDPSRAPIVirtualChannel* This,BSTR bstrData,LONG lAttendeeId,ULONG ChannelSendFlags) {
    return This->lpVtbl->SendData(This,bstrData,lAttendeeId,ChannelSendFlags);
}
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannel_SetAccess(IRDPSRAPIVirtualChannel* This,LONG lAttendeeId,CHANNEL_ACCESS_ENUM AccessType) {
    return This->lpVtbl->SetAccess(This,lAttendeeId,AccessType);
}
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannel_get_Name(IRDPSRAPIVirtualChannel* This,BSTR *pbstrName) {
    return This->lpVtbl->get_Name(This,pbstrName);
}
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannel_get_Flags(IRDPSRAPIVirtualChannel* This,LONG *plFlags) {
    return This->lpVtbl->get_Flags(This,plFlags);
}
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannel_get_Priority(IRDPSRAPIVirtualChannel* This,CHANNEL_PRIORITY *pPriority) {
    return This->lpVtbl->get_Priority(This,pPriority);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIVirtualChannel_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPIVirtualChannelManager interface
 */
#ifndef __IRDPSRAPIVirtualChannelManager_INTERFACE_DEFINED__
#define __IRDPSRAPIVirtualChannelManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIVirtualChannelManager, 0x0d11c661, 0x5d0d, 0x4ee4, 0x89,0xdf, 0x21,0x66,0xae,0x1f,0xdf,0xed);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0d11c661-5d0d-4ee4-89df-2166ae1fdfed")
IRDPSRAPIVirtualChannelManager : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        VARIANT item,
        IRDPSRAPIVirtualChannel **pChannel) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateVirtualChannel(
        BSTR bstrChannelName,
        CHANNEL_PRIORITY Priority,
        ULONG ChannelFlags,
        IRDPSRAPIVirtualChannel **ppChannel) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIVirtualChannelManager, 0x0d11c661, 0x5d0d, 0x4ee4, 0x89,0xdf, 0x21,0x66,0xae,0x1f,0xdf,0xed)
#endif
#else
typedef struct IRDPSRAPIVirtualChannelManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPIVirtualChannelManager *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPIVirtualChannelManager *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPIVirtualChannelManager *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPIVirtualChannelManager *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPIVirtualChannelManager methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IRDPSRAPIVirtualChannelManager *This,
        IUnknown **retval);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IRDPSRAPIVirtualChannelManager *This,
        VARIANT item,
        IRDPSRAPIVirtualChannel **pChannel);

    HRESULT (STDMETHODCALLTYPE *CreateVirtualChannel)(
        IRDPSRAPIVirtualChannelManager *This,
        BSTR bstrChannelName,
        CHANNEL_PRIORITY Priority,
        ULONG ChannelFlags,
        IRDPSRAPIVirtualChannel **ppChannel);

    END_INTERFACE
} IRDPSRAPIVirtualChannelManagerVtbl;

interface IRDPSRAPIVirtualChannelManager {
    CONST_VTBL IRDPSRAPIVirtualChannelManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIVirtualChannelManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIVirtualChannelManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIVirtualChannelManager_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPIVirtualChannelManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPIVirtualChannelManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPIVirtualChannelManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPIVirtualChannelManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPIVirtualChannelManager methods ***/
#define IRDPSRAPIVirtualChannelManager_get__NewEnum(This,retval) (This)->lpVtbl->get__NewEnum(This,retval)
#define IRDPSRAPIVirtualChannelManager_get_Item(This,item,pChannel) (This)->lpVtbl->get_Item(This,item,pChannel)
#define IRDPSRAPIVirtualChannelManager_CreateVirtualChannel(This,bstrChannelName,Priority,ChannelFlags,ppChannel) (This)->lpVtbl->CreateVirtualChannel(This,bstrChannelName,Priority,ChannelFlags,ppChannel)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannelManager_QueryInterface(IRDPSRAPIVirtualChannelManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIVirtualChannelManager_AddRef(IRDPSRAPIVirtualChannelManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIVirtualChannelManager_Release(IRDPSRAPIVirtualChannelManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannelManager_GetTypeInfoCount(IRDPSRAPIVirtualChannelManager* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannelManager_GetTypeInfo(IRDPSRAPIVirtualChannelManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannelManager_GetIDsOfNames(IRDPSRAPIVirtualChannelManager* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannelManager_Invoke(IRDPSRAPIVirtualChannelManager* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPIVirtualChannelManager methods ***/
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannelManager_get__NewEnum(IRDPSRAPIVirtualChannelManager* This,IUnknown **retval) {
    return This->lpVtbl->get__NewEnum(This,retval);
}
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannelManager_get_Item(IRDPSRAPIVirtualChannelManager* This,VARIANT item,IRDPSRAPIVirtualChannel **pChannel) {
    return This->lpVtbl->get_Item(This,item,pChannel);
}
static FORCEINLINE HRESULT IRDPSRAPIVirtualChannelManager_CreateVirtualChannel(IRDPSRAPIVirtualChannelManager* This,BSTR bstrChannelName,CHANNEL_PRIORITY Priority,ULONG ChannelFlags,IRDPSRAPIVirtualChannel **ppChannel) {
    return This->lpVtbl->CreateVirtualChannel(This,bstrChannelName,Priority,ChannelFlags,ppChannel);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIVirtualChannelManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPIViewer interface
 */
#ifndef __IRDPSRAPIViewer_INTERFACE_DEFINED__
#define __IRDPSRAPIViewer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIViewer, 0xc6bfcd38, 0x8ce9, 0x404d, 0x8a,0xe8, 0xf3,0x1d,0x00,0xc6,0x5c,0xb5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c6bfcd38-8ce9-404d-8ae8-f31d00c65cb5")
IRDPSRAPIViewer : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE Connect(
        BSTR bstrConnectionString,
        BSTR bstrName,
        BSTR bstrPassword) = 0;

    virtual HRESULT STDMETHODCALLTYPE Disconnect(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Attendees(
        IRDPSRAPIAttendeeManager **ppVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Invitations(
        IRDPSRAPIInvitationManager **ppVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ApplicationFilter(
        IRDPSRAPIApplicationFilter **ppVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_VirtualChannelManager(
        IRDPSRAPIVirtualChannelManager **ppVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SmartSizing(
        VARIANT_BOOL vbSmartSizing) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SmartSizing(
        VARIANT_BOOL *pvbSmartSizing) = 0;

    virtual HRESULT STDMETHODCALLTYPE RequestControl(
        CTRL_LEVEL CtrlLevel) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DisconnectedText(
        BSTR bstrDisconnectedText) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DisconnectedText(
        BSTR *pbstrDisconnectedText) = 0;

    virtual HRESULT STDMETHODCALLTYPE RequestColorDepthChange(
        LONG Bpp) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Properties(
        IRDPSRAPISessionProperties **ppVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartReverseConnectListener(
        BSTR bstrConnectionString,
        BSTR bstrUserName,
        BSTR bstrPassword,
        BSTR *pbstrReverseConnectString) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIViewer, 0xc6bfcd38, 0x8ce9, 0x404d, 0x8a,0xe8, 0xf3,0x1d,0x00,0xc6,0x5c,0xb5)
#endif
#else
typedef struct IRDPSRAPIViewerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPIViewer *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPIViewer *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPIViewer *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPIViewer *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPIViewer methods ***/
    HRESULT (STDMETHODCALLTYPE *Connect)(
        IRDPSRAPIViewer *This,
        BSTR bstrConnectionString,
        BSTR bstrName,
        BSTR bstrPassword);

    HRESULT (STDMETHODCALLTYPE *Disconnect)(
        IRDPSRAPIViewer *This);

    HRESULT (STDMETHODCALLTYPE *get_Attendees)(
        IRDPSRAPIViewer *This,
        IRDPSRAPIAttendeeManager **ppVal);

    HRESULT (STDMETHODCALLTYPE *get_Invitations)(
        IRDPSRAPIViewer *This,
        IRDPSRAPIInvitationManager **ppVal);

    HRESULT (STDMETHODCALLTYPE *get_ApplicationFilter)(
        IRDPSRAPIViewer *This,
        IRDPSRAPIApplicationFilter **ppVal);

    HRESULT (STDMETHODCALLTYPE *get_VirtualChannelManager)(
        IRDPSRAPIViewer *This,
        IRDPSRAPIVirtualChannelManager **ppVal);

    HRESULT (STDMETHODCALLTYPE *put_SmartSizing)(
        IRDPSRAPIViewer *This,
        VARIANT_BOOL vbSmartSizing);

    HRESULT (STDMETHODCALLTYPE *get_SmartSizing)(
        IRDPSRAPIViewer *This,
        VARIANT_BOOL *pvbSmartSizing);

    HRESULT (STDMETHODCALLTYPE *RequestControl)(
        IRDPSRAPIViewer *This,
        CTRL_LEVEL CtrlLevel);

    HRESULT (STDMETHODCALLTYPE *put_DisconnectedText)(
        IRDPSRAPIViewer *This,
        BSTR bstrDisconnectedText);

    HRESULT (STDMETHODCALLTYPE *get_DisconnectedText)(
        IRDPSRAPIViewer *This,
        BSTR *pbstrDisconnectedText);

    HRESULT (STDMETHODCALLTYPE *RequestColorDepthChange)(
        IRDPSRAPIViewer *This,
        LONG Bpp);

    HRESULT (STDMETHODCALLTYPE *get_Properties)(
        IRDPSRAPIViewer *This,
        IRDPSRAPISessionProperties **ppVal);

    HRESULT (STDMETHODCALLTYPE *StartReverseConnectListener)(
        IRDPSRAPIViewer *This,
        BSTR bstrConnectionString,
        BSTR bstrUserName,
        BSTR bstrPassword,
        BSTR *pbstrReverseConnectString);

    END_INTERFACE
} IRDPSRAPIViewerVtbl;

interface IRDPSRAPIViewer {
    CONST_VTBL IRDPSRAPIViewerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIViewer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIViewer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIViewer_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPIViewer_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPIViewer_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPIViewer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPIViewer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPIViewer methods ***/
#define IRDPSRAPIViewer_Connect(This,bstrConnectionString,bstrName,bstrPassword) (This)->lpVtbl->Connect(This,bstrConnectionString,bstrName,bstrPassword)
#define IRDPSRAPIViewer_Disconnect(This) (This)->lpVtbl->Disconnect(This)
#define IRDPSRAPIViewer_get_Attendees(This,ppVal) (This)->lpVtbl->get_Attendees(This,ppVal)
#define IRDPSRAPIViewer_get_Invitations(This,ppVal) (This)->lpVtbl->get_Invitations(This,ppVal)
#define IRDPSRAPIViewer_get_ApplicationFilter(This,ppVal) (This)->lpVtbl->get_ApplicationFilter(This,ppVal)
#define IRDPSRAPIViewer_get_VirtualChannelManager(This,ppVal) (This)->lpVtbl->get_VirtualChannelManager(This,ppVal)
#define IRDPSRAPIViewer_put_SmartSizing(This,vbSmartSizing) (This)->lpVtbl->put_SmartSizing(This,vbSmartSizing)
#define IRDPSRAPIViewer_get_SmartSizing(This,pvbSmartSizing) (This)->lpVtbl->get_SmartSizing(This,pvbSmartSizing)
#define IRDPSRAPIViewer_RequestControl(This,CtrlLevel) (This)->lpVtbl->RequestControl(This,CtrlLevel)
#define IRDPSRAPIViewer_put_DisconnectedText(This,bstrDisconnectedText) (This)->lpVtbl->put_DisconnectedText(This,bstrDisconnectedText)
#define IRDPSRAPIViewer_get_DisconnectedText(This,pbstrDisconnectedText) (This)->lpVtbl->get_DisconnectedText(This,pbstrDisconnectedText)
#define IRDPSRAPIViewer_RequestColorDepthChange(This,Bpp) (This)->lpVtbl->RequestColorDepthChange(This,Bpp)
#define IRDPSRAPIViewer_get_Properties(This,ppVal) (This)->lpVtbl->get_Properties(This,ppVal)
#define IRDPSRAPIViewer_StartReverseConnectListener(This,bstrConnectionString,bstrUserName,bstrPassword,pbstrReverseConnectString) (This)->lpVtbl->StartReverseConnectListener(This,bstrConnectionString,bstrUserName,bstrPassword,pbstrReverseConnectString)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIViewer_QueryInterface(IRDPSRAPIViewer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIViewer_AddRef(IRDPSRAPIViewer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIViewer_Release(IRDPSRAPIViewer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPIViewer_GetTypeInfoCount(IRDPSRAPIViewer* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPIViewer_GetTypeInfo(IRDPSRAPIViewer* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPIViewer_GetIDsOfNames(IRDPSRAPIViewer* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPIViewer_Invoke(IRDPSRAPIViewer* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPIViewer methods ***/
static FORCEINLINE HRESULT IRDPSRAPIViewer_Connect(IRDPSRAPIViewer* This,BSTR bstrConnectionString,BSTR bstrName,BSTR bstrPassword) {
    return This->lpVtbl->Connect(This,bstrConnectionString,bstrName,bstrPassword);
}
static FORCEINLINE HRESULT IRDPSRAPIViewer_Disconnect(IRDPSRAPIViewer* This) {
    return This->lpVtbl->Disconnect(This);
}
static FORCEINLINE HRESULT IRDPSRAPIViewer_get_Attendees(IRDPSRAPIViewer* This,IRDPSRAPIAttendeeManager **ppVal) {
    return This->lpVtbl->get_Attendees(This,ppVal);
}
static FORCEINLINE HRESULT IRDPSRAPIViewer_get_Invitations(IRDPSRAPIViewer* This,IRDPSRAPIInvitationManager **ppVal) {
    return This->lpVtbl->get_Invitations(This,ppVal);
}
static FORCEINLINE HRESULT IRDPSRAPIViewer_get_ApplicationFilter(IRDPSRAPIViewer* This,IRDPSRAPIApplicationFilter **ppVal) {
    return This->lpVtbl->get_ApplicationFilter(This,ppVal);
}
static FORCEINLINE HRESULT IRDPSRAPIViewer_get_VirtualChannelManager(IRDPSRAPIViewer* This,IRDPSRAPIVirtualChannelManager **ppVal) {
    return This->lpVtbl->get_VirtualChannelManager(This,ppVal);
}
static FORCEINLINE HRESULT IRDPSRAPIViewer_put_SmartSizing(IRDPSRAPIViewer* This,VARIANT_BOOL vbSmartSizing) {
    return This->lpVtbl->put_SmartSizing(This,vbSmartSizing);
}
static FORCEINLINE HRESULT IRDPSRAPIViewer_get_SmartSizing(IRDPSRAPIViewer* This,VARIANT_BOOL *pvbSmartSizing) {
    return This->lpVtbl->get_SmartSizing(This,pvbSmartSizing);
}
static FORCEINLINE HRESULT IRDPSRAPIViewer_RequestControl(IRDPSRAPIViewer* This,CTRL_LEVEL CtrlLevel) {
    return This->lpVtbl->RequestControl(This,CtrlLevel);
}
static FORCEINLINE HRESULT IRDPSRAPIViewer_put_DisconnectedText(IRDPSRAPIViewer* This,BSTR bstrDisconnectedText) {
    return This->lpVtbl->put_DisconnectedText(This,bstrDisconnectedText);
}
static FORCEINLINE HRESULT IRDPSRAPIViewer_get_DisconnectedText(IRDPSRAPIViewer* This,BSTR *pbstrDisconnectedText) {
    return This->lpVtbl->get_DisconnectedText(This,pbstrDisconnectedText);
}
static FORCEINLINE HRESULT IRDPSRAPIViewer_RequestColorDepthChange(IRDPSRAPIViewer* This,LONG Bpp) {
    return This->lpVtbl->RequestColorDepthChange(This,Bpp);
}
static FORCEINLINE HRESULT IRDPSRAPIViewer_get_Properties(IRDPSRAPIViewer* This,IRDPSRAPISessionProperties **ppVal) {
    return This->lpVtbl->get_Properties(This,ppVal);
}
static FORCEINLINE HRESULT IRDPSRAPIViewer_StartReverseConnectListener(IRDPSRAPIViewer* This,BSTR bstrConnectionString,BSTR bstrUserName,BSTR bstrPassword,BSTR *pbstrReverseConnectString) {
    return This->lpVtbl->StartReverseConnectListener(This,bstrConnectionString,bstrUserName,bstrPassword,pbstrReverseConnectString);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIViewer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPViewerRenderingSurface interface
 */
#ifndef __IRDPViewerRenderingSurface_INTERFACE_DEFINED__
#define __IRDPViewerRenderingSurface_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPViewerRenderingSurface, 0x56bfce32, 0x83e9, 0x414d, 0x82,0xe8, 0xf3,0x1d,0x01,0xc6,0x2c,0xb5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("56bfce32-83e9-414d-82e8-f31d01c62cb5")
IRDPViewerRenderingSurface : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetRenderingSurface(
        IUnknown *pRenderingSurface,
        LONG surfaceWidth,
        LONG surfaceHeight) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPViewerRenderingSurface, 0x56bfce32, 0x83e9, 0x414d, 0x82,0xe8, 0xf3,0x1d,0x01,0xc6,0x2c,0xb5)
#endif
#else
typedef struct IRDPViewerRenderingSurfaceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRDPViewerRenderingSurface methods ***/
    HRESULT (STDMETHODCALLTYPE *SetRenderingSurface)(
        IRDPViewerRenderingSurface *This,
        IUnknown *pRenderingSurface,
        LONG surfaceWidth,
        LONG surfaceHeight);

    END_INTERFACE
} IRDPViewerRenderingSurfaceVtbl;

interface IRDPViewerRenderingSurface {
    CONST_VTBL IRDPViewerRenderingSurfaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPViewerRenderingSurface_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPViewerRenderingSurface_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPViewerRenderingSurface_Release(This) (This)->lpVtbl->Release(This)
/*** IRDPViewerRenderingSurface methods ***/
#define IRDPViewerRenderingSurface_SetRenderingSurface(This,pRenderingSurface,surfaceWidth,surfaceHeight) (This)->lpVtbl->SetRenderingSurface(This,pRenderingSurface,surfaceWidth,surfaceHeight)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPViewerRenderingSurface_QueryInterface(IRDPViewerRenderingSurface* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPViewerRenderingSurface_AddRef(IRDPViewerRenderingSurface* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPViewerRenderingSurface_Release(IRDPViewerRenderingSurface* This) {
    return This->lpVtbl->Release(This);
}
/*** IRDPViewerRenderingSurface methods ***/
static FORCEINLINE HRESULT IRDPViewerRenderingSurface_SetRenderingSurface(IRDPViewerRenderingSurface* This,IUnknown *pRenderingSurface,LONG surfaceWidth,LONG surfaceHeight) {
    return This->lpVtbl->SetRenderingSurface(This,pRenderingSurface,surfaceWidth,surfaceHeight);
}
#endif
#endif

#endif


#endif  /* __IRDPViewerRenderingSurface_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPViewerInputSink interface
 */
#ifndef __IRDPViewerInputSink_INTERFACE_DEFINED__
#define __IRDPViewerInputSink_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPViewerInputSink, 0xbb590853, 0xa6c5, 0x4a7b, 0x8d,0xd4, 0x76,0xb6,0x9e,0xea,0x12,0xd5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bb590853-a6c5-4a7b-8dd4-76b69eea12d5")
IRDPViewerInputSink : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SendMouseButtonEvent(
        RDPSRAPI_MOUSE_BUTTON_TYPE buttonType,
        VARIANT_BOOL vbButtonDown,
        ULONG xPos,
        ULONG yPos) = 0;

    virtual HRESULT STDMETHODCALLTYPE SendMouseMoveEvent(
        ULONG xPos,
        ULONG yPos) = 0;

    virtual HRESULT STDMETHODCALLTYPE SendMouseWheelEvent(
        UINT16 wheelRotation) = 0;

    virtual HRESULT STDMETHODCALLTYPE SendKeyboardEvent(
        RDPSRAPI_KBD_CODE_TYPE codeType,
        UINT16 keycode,
        VARIANT_BOOL vbKeyUp,
        VARIANT_BOOL vbRepeat,
        VARIANT_BOOL vbExtended) = 0;

    virtual HRESULT STDMETHODCALLTYPE SendSyncEvent(
        ULONG syncFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginTouchFrame(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddTouchInput(
        UINT32 contactId,
        UINT32 evnt,
        INT32 x,
        INT32 y) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndTouchFrame(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPViewerInputSink, 0xbb590853, 0xa6c5, 0x4a7b, 0x8d,0xd4, 0x76,0xb6,0x9e,0xea,0x12,0xd5)
#endif
#else
typedef struct IRDPViewerInputSinkVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRDPViewerInputSink methods ***/
    HRESULT (STDMETHODCALLTYPE *SendMouseButtonEvent)(
        IRDPViewerInputSink *This,
        RDPSRAPI_MOUSE_BUTTON_TYPE buttonType,
        VARIANT_BOOL vbButtonDown,
        ULONG xPos,
        ULONG yPos);

    HRESULT (STDMETHODCALLTYPE *SendMouseMoveEvent)(
        IRDPViewerInputSink *This,
        ULONG xPos,
        ULONG yPos);

    HRESULT (STDMETHODCALLTYPE *SendMouseWheelEvent)(
        IRDPViewerInputSink *This,
        UINT16 wheelRotation);

    HRESULT (STDMETHODCALLTYPE *SendKeyboardEvent)(
        IRDPViewerInputSink *This,
        RDPSRAPI_KBD_CODE_TYPE codeType,
        UINT16 keycode,
        VARIANT_BOOL vbKeyUp,
        VARIANT_BOOL vbRepeat,
        VARIANT_BOOL vbExtended);

    HRESULT (STDMETHODCALLTYPE *SendSyncEvent)(
        IRDPViewerInputSink *This,
        ULONG syncFlags);

    HRESULT (STDMETHODCALLTYPE *BeginTouchFrame)(
        IRDPViewerInputSink *This);

    HRESULT (STDMETHODCALLTYPE *AddTouchInput)(
        IRDPViewerInputSink *This,
        UINT32 contactId,
        UINT32 evnt,
        INT32 x,
        INT32 y);

    HRESULT (STDMETHODCALLTYPE *EndTouchFrame)(
        IRDPViewerInputSink *This);

    END_INTERFACE
} IRDPViewerInputSinkVtbl;

interface IRDPViewerInputSink {
    CONST_VTBL IRDPViewerInputSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPViewerInputSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPViewerInputSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPViewerInputSink_Release(This) (This)->lpVtbl->Release(This)
/*** IRDPViewerInputSink methods ***/
#define IRDPViewerInputSink_SendMouseButtonEvent(This,buttonType,vbButtonDown,xPos,yPos) (This)->lpVtbl->SendMouseButtonEvent(This,buttonType,vbButtonDown,xPos,yPos)
#define IRDPViewerInputSink_SendMouseMoveEvent(This,xPos,yPos) (This)->lpVtbl->SendMouseMoveEvent(This,xPos,yPos)
#define IRDPViewerInputSink_SendMouseWheelEvent(This,wheelRotation) (This)->lpVtbl->SendMouseWheelEvent(This,wheelRotation)
#define IRDPViewerInputSink_SendKeyboardEvent(This,codeType,keycode,vbKeyUp,vbRepeat,vbExtended) (This)->lpVtbl->SendKeyboardEvent(This,codeType,keycode,vbKeyUp,vbRepeat,vbExtended)
#define IRDPViewerInputSink_SendSyncEvent(This,syncFlags) (This)->lpVtbl->SendSyncEvent(This,syncFlags)
#define IRDPViewerInputSink_BeginTouchFrame(This) (This)->lpVtbl->BeginTouchFrame(This)
#define IRDPViewerInputSink_AddTouchInput(This,contactId,evnt,x,y) (This)->lpVtbl->AddTouchInput(This,contactId,evnt,x,y)
#define IRDPViewerInputSink_EndTouchFrame(This) (This)->lpVtbl->EndTouchFrame(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPViewerInputSink_QueryInterface(IRDPViewerInputSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPViewerInputSink_AddRef(IRDPViewerInputSink* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPViewerInputSink_Release(IRDPViewerInputSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IRDPViewerInputSink methods ***/
static FORCEINLINE HRESULT IRDPViewerInputSink_SendMouseButtonEvent(IRDPViewerInputSink* This,RDPSRAPI_MOUSE_BUTTON_TYPE buttonType,VARIANT_BOOL vbButtonDown,ULONG xPos,ULONG yPos) {
    return This->lpVtbl->SendMouseButtonEvent(This,buttonType,vbButtonDown,xPos,yPos);
}
static FORCEINLINE HRESULT IRDPViewerInputSink_SendMouseMoveEvent(IRDPViewerInputSink* This,ULONG xPos,ULONG yPos) {
    return This->lpVtbl->SendMouseMoveEvent(This,xPos,yPos);
}
static FORCEINLINE HRESULT IRDPViewerInputSink_SendMouseWheelEvent(IRDPViewerInputSink* This,UINT16 wheelRotation) {
    return This->lpVtbl->SendMouseWheelEvent(This,wheelRotation);
}
static FORCEINLINE HRESULT IRDPViewerInputSink_SendKeyboardEvent(IRDPViewerInputSink* This,RDPSRAPI_KBD_CODE_TYPE codeType,UINT16 keycode,VARIANT_BOOL vbKeyUp,VARIANT_BOOL vbRepeat,VARIANT_BOOL vbExtended) {
    return This->lpVtbl->SendKeyboardEvent(This,codeType,keycode,vbKeyUp,vbRepeat,vbExtended);
}
static FORCEINLINE HRESULT IRDPViewerInputSink_SendSyncEvent(IRDPViewerInputSink* This,ULONG syncFlags) {
    return This->lpVtbl->SendSyncEvent(This,syncFlags);
}
static FORCEINLINE HRESULT IRDPViewerInputSink_BeginTouchFrame(IRDPViewerInputSink* This) {
    return This->lpVtbl->BeginTouchFrame(This);
}
static FORCEINLINE HRESULT IRDPViewerInputSink_AddTouchInput(IRDPViewerInputSink* This,UINT32 contactId,UINT32 evnt,INT32 x,INT32 y) {
    return This->lpVtbl->AddTouchInput(This,contactId,evnt,x,y);
}
static FORCEINLINE HRESULT IRDPViewerInputSink_EndTouchFrame(IRDPViewerInputSink* This) {
    return This->lpVtbl->EndTouchFrame(This);
}
#endif
#endif

#endif


#endif  /* __IRDPViewerInputSink_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPIFrameBuffer interface
 */
#ifndef __IRDPSRAPIFrameBuffer_INTERFACE_DEFINED__
#define __IRDPSRAPIFrameBuffer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPIFrameBuffer, 0x3d67e7d2, 0xb27b, 0x448e, 0x81,0xb3, 0xc6,0x11,0x0e,0xd8,0xb4,0xbe);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3d67e7d2-b27b-448e-81b3-c6110ed8b4be")
IRDPSRAPIFrameBuffer : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Width(
        LONG *plWidth) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Height(
        LONG *plHeight) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Bpp(
        LONG *plBpp) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFrameBufferBits(
        LONG x,
        LONG y,
        LONG Width,
        LONG Heigth,
        SAFEARRAY **ppBits) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPIFrameBuffer, 0x3d67e7d2, 0xb27b, 0x448e, 0x81,0xb3, 0xc6,0x11,0x0e,0xd8,0xb4,0xbe)
#endif
#else
typedef struct IRDPSRAPIFrameBufferVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPIFrameBuffer *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPIFrameBuffer *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPIFrameBuffer *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPIFrameBuffer *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPIFrameBuffer methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Width)(
        IRDPSRAPIFrameBuffer *This,
        LONG *plWidth);

    HRESULT (STDMETHODCALLTYPE *get_Height)(
        IRDPSRAPIFrameBuffer *This,
        LONG *plHeight);

    HRESULT (STDMETHODCALLTYPE *get_Bpp)(
        IRDPSRAPIFrameBuffer *This,
        LONG *plBpp);

    HRESULT (STDMETHODCALLTYPE *GetFrameBufferBits)(
        IRDPSRAPIFrameBuffer *This,
        LONG x,
        LONG y,
        LONG Width,
        LONG Heigth,
        SAFEARRAY **ppBits);

    END_INTERFACE
} IRDPSRAPIFrameBufferVtbl;

interface IRDPSRAPIFrameBuffer {
    CONST_VTBL IRDPSRAPIFrameBufferVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPIFrameBuffer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPIFrameBuffer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPIFrameBuffer_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPIFrameBuffer_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPIFrameBuffer_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPIFrameBuffer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPIFrameBuffer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPIFrameBuffer methods ***/
#define IRDPSRAPIFrameBuffer_get_Width(This,plWidth) (This)->lpVtbl->get_Width(This,plWidth)
#define IRDPSRAPIFrameBuffer_get_Height(This,plHeight) (This)->lpVtbl->get_Height(This,plHeight)
#define IRDPSRAPIFrameBuffer_get_Bpp(This,plBpp) (This)->lpVtbl->get_Bpp(This,plBpp)
#define IRDPSRAPIFrameBuffer_GetFrameBufferBits(This,x,y,Width,Heigth,ppBits) (This)->lpVtbl->GetFrameBufferBits(This,x,y,Width,Heigth,ppBits)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPIFrameBuffer_QueryInterface(IRDPSRAPIFrameBuffer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPIFrameBuffer_AddRef(IRDPSRAPIFrameBuffer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPIFrameBuffer_Release(IRDPSRAPIFrameBuffer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPIFrameBuffer_GetTypeInfoCount(IRDPSRAPIFrameBuffer* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPIFrameBuffer_GetTypeInfo(IRDPSRAPIFrameBuffer* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPIFrameBuffer_GetIDsOfNames(IRDPSRAPIFrameBuffer* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPIFrameBuffer_Invoke(IRDPSRAPIFrameBuffer* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPIFrameBuffer methods ***/
static FORCEINLINE HRESULT IRDPSRAPIFrameBuffer_get_Width(IRDPSRAPIFrameBuffer* This,LONG *plWidth) {
    return This->lpVtbl->get_Width(This,plWidth);
}
static FORCEINLINE HRESULT IRDPSRAPIFrameBuffer_get_Height(IRDPSRAPIFrameBuffer* This,LONG *plHeight) {
    return This->lpVtbl->get_Height(This,plHeight);
}
static FORCEINLINE HRESULT IRDPSRAPIFrameBuffer_get_Bpp(IRDPSRAPIFrameBuffer* This,LONG *plBpp) {
    return This->lpVtbl->get_Bpp(This,plBpp);
}
static FORCEINLINE HRESULT IRDPSRAPIFrameBuffer_GetFrameBufferBits(IRDPSRAPIFrameBuffer* This,LONG x,LONG y,LONG Width,LONG Heigth,SAFEARRAY **ppBits) {
    return This->lpVtbl->GetFrameBufferBits(This,x,y,Width,Heigth,ppBits);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPIFrameBuffer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPITransportStreamBuffer interface
 */
#ifndef __IRDPSRAPITransportStreamBuffer_INTERFACE_DEFINED__
#define __IRDPSRAPITransportStreamBuffer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPITransportStreamBuffer, 0x81c80290, 0x5085, 0x44b0, 0xb4,0x60, 0xf8,0x65,0xc3,0x9c,0xb4,0xa9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("81c80290-5085-44b0-b460-f865c39cb4a9")
IRDPSRAPITransportStreamBuffer : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_Storage(
        BYTE **ppbStorage) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StorageSize(
        LONG *plMaxStore) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PayloadSize(
        LONG *plRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_PayloadSize(
        LONG lVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PayloadOffset(
        LONG *plRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_PayloadOffset(
        LONG lRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Flags(
        LONG *plFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Flags(
        LONG lFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Context(
        IUnknown **ppContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Context(
        IUnknown *pContext) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPITransportStreamBuffer, 0x81c80290, 0x5085, 0x44b0, 0xb4,0x60, 0xf8,0x65,0xc3,0x9c,0xb4,0xa9)
#endif
#else
typedef struct IRDPSRAPITransportStreamBufferVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRDPSRAPITransportStreamBuffer methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Storage)(
        IRDPSRAPITransportStreamBuffer *This,
        BYTE **ppbStorage);

    HRESULT (STDMETHODCALLTYPE *get_StorageSize)(
        IRDPSRAPITransportStreamBuffer *This,
        LONG *plMaxStore);

    HRESULT (STDMETHODCALLTYPE *get_PayloadSize)(
        IRDPSRAPITransportStreamBuffer *This,
        LONG *plRetVal);

    HRESULT (STDMETHODCALLTYPE *put_PayloadSize)(
        IRDPSRAPITransportStreamBuffer *This,
        LONG lVal);

    HRESULT (STDMETHODCALLTYPE *get_PayloadOffset)(
        IRDPSRAPITransportStreamBuffer *This,
        LONG *plRetVal);

    HRESULT (STDMETHODCALLTYPE *put_PayloadOffset)(
        IRDPSRAPITransportStreamBuffer *This,
        LONG lRetVal);

    HRESULT (STDMETHODCALLTYPE *get_Flags)(
        IRDPSRAPITransportStreamBuffer *This,
        LONG *plFlags);

    HRESULT (STDMETHODCALLTYPE *put_Flags)(
        IRDPSRAPITransportStreamBuffer *This,
        LONG lFlags);

    HRESULT (STDMETHODCALLTYPE *get_Context)(
        IRDPSRAPITransportStreamBuffer *This,
        IUnknown **ppContext);

    HRESULT (STDMETHODCALLTYPE *put_Context)(
        IRDPSRAPITransportStreamBuffer *This,
        IUnknown *pContext);

    END_INTERFACE
} IRDPSRAPITransportStreamBufferVtbl;

interface IRDPSRAPITransportStreamBuffer {
    CONST_VTBL IRDPSRAPITransportStreamBufferVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPITransportStreamBuffer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPITransportStreamBuffer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPITransportStreamBuffer_Release(This) (This)->lpVtbl->Release(This)
/*** IRDPSRAPITransportStreamBuffer methods ***/
#define IRDPSRAPITransportStreamBuffer_get_Storage(This,ppbStorage) (This)->lpVtbl->get_Storage(This,ppbStorage)
#define IRDPSRAPITransportStreamBuffer_get_StorageSize(This,plMaxStore) (This)->lpVtbl->get_StorageSize(This,plMaxStore)
#define IRDPSRAPITransportStreamBuffer_get_PayloadSize(This,plRetVal) (This)->lpVtbl->get_PayloadSize(This,plRetVal)
#define IRDPSRAPITransportStreamBuffer_put_PayloadSize(This,lVal) (This)->lpVtbl->put_PayloadSize(This,lVal)
#define IRDPSRAPITransportStreamBuffer_get_PayloadOffset(This,plRetVal) (This)->lpVtbl->get_PayloadOffset(This,plRetVal)
#define IRDPSRAPITransportStreamBuffer_put_PayloadOffset(This,lRetVal) (This)->lpVtbl->put_PayloadOffset(This,lRetVal)
#define IRDPSRAPITransportStreamBuffer_get_Flags(This,plFlags) (This)->lpVtbl->get_Flags(This,plFlags)
#define IRDPSRAPITransportStreamBuffer_put_Flags(This,lFlags) (This)->lpVtbl->put_Flags(This,lFlags)
#define IRDPSRAPITransportStreamBuffer_get_Context(This,ppContext) (This)->lpVtbl->get_Context(This,ppContext)
#define IRDPSRAPITransportStreamBuffer_put_Context(This,pContext) (This)->lpVtbl->put_Context(This,pContext)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPITransportStreamBuffer_QueryInterface(IRDPSRAPITransportStreamBuffer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPITransportStreamBuffer_AddRef(IRDPSRAPITransportStreamBuffer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPITransportStreamBuffer_Release(IRDPSRAPITransportStreamBuffer* This) {
    return This->lpVtbl->Release(This);
}
/*** IRDPSRAPITransportStreamBuffer methods ***/
static FORCEINLINE HRESULT IRDPSRAPITransportStreamBuffer_get_Storage(IRDPSRAPITransportStreamBuffer* This,BYTE **ppbStorage) {
    return This->lpVtbl->get_Storage(This,ppbStorage);
}
static FORCEINLINE HRESULT IRDPSRAPITransportStreamBuffer_get_StorageSize(IRDPSRAPITransportStreamBuffer* This,LONG *plMaxStore) {
    return This->lpVtbl->get_StorageSize(This,plMaxStore);
}
static FORCEINLINE HRESULT IRDPSRAPITransportStreamBuffer_get_PayloadSize(IRDPSRAPITransportStreamBuffer* This,LONG *plRetVal) {
    return This->lpVtbl->get_PayloadSize(This,plRetVal);
}
static FORCEINLINE HRESULT IRDPSRAPITransportStreamBuffer_put_PayloadSize(IRDPSRAPITransportStreamBuffer* This,LONG lVal) {
    return This->lpVtbl->put_PayloadSize(This,lVal);
}
static FORCEINLINE HRESULT IRDPSRAPITransportStreamBuffer_get_PayloadOffset(IRDPSRAPITransportStreamBuffer* This,LONG *plRetVal) {
    return This->lpVtbl->get_PayloadOffset(This,plRetVal);
}
static FORCEINLINE HRESULT IRDPSRAPITransportStreamBuffer_put_PayloadOffset(IRDPSRAPITransportStreamBuffer* This,LONG lRetVal) {
    return This->lpVtbl->put_PayloadOffset(This,lRetVal);
}
static FORCEINLINE HRESULT IRDPSRAPITransportStreamBuffer_get_Flags(IRDPSRAPITransportStreamBuffer* This,LONG *plFlags) {
    return This->lpVtbl->get_Flags(This,plFlags);
}
static FORCEINLINE HRESULT IRDPSRAPITransportStreamBuffer_put_Flags(IRDPSRAPITransportStreamBuffer* This,LONG lFlags) {
    return This->lpVtbl->put_Flags(This,lFlags);
}
static FORCEINLINE HRESULT IRDPSRAPITransportStreamBuffer_get_Context(IRDPSRAPITransportStreamBuffer* This,IUnknown **ppContext) {
    return This->lpVtbl->get_Context(This,ppContext);
}
static FORCEINLINE HRESULT IRDPSRAPITransportStreamBuffer_put_Context(IRDPSRAPITransportStreamBuffer* This,IUnknown *pContext) {
    return This->lpVtbl->put_Context(This,pContext);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPITransportStreamBuffer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPITransportStreamEvents interface
 */
#ifndef __IRDPSRAPITransportStreamEvents_INTERFACE_DEFINED__
#define __IRDPSRAPITransportStreamEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPITransportStreamEvents, 0xea81c254, 0xf5af, 0x4e40, 0x98,0x2e, 0x3e,0x63,0xbb,0x59,0x52,0x76);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ea81c254-f5af-4e40-982e-3e63bb595276")
IRDPSRAPITransportStreamEvents : public IUnknown
{
    virtual void STDMETHODCALLTYPE OnWriteCompleted(
        IRDPSRAPITransportStreamBuffer *pBuffer) = 0;

    virtual void STDMETHODCALLTYPE OnReadCompleted(
        IRDPSRAPITransportStreamBuffer *pBuffer) = 0;

    virtual void STDMETHODCALLTYPE OnStreamClosed(
        HRESULT hrReason) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPITransportStreamEvents, 0xea81c254, 0xf5af, 0x4e40, 0x98,0x2e, 0x3e,0x63,0xbb,0x59,0x52,0x76)
#endif
#else
typedef struct IRDPSRAPITransportStreamEventsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRDPSRAPITransportStreamEvents methods ***/
    void (STDMETHODCALLTYPE *OnWriteCompleted)(
        IRDPSRAPITransportStreamEvents *This,
        IRDPSRAPITransportStreamBuffer *pBuffer);

    void (STDMETHODCALLTYPE *OnReadCompleted)(
        IRDPSRAPITransportStreamEvents *This,
        IRDPSRAPITransportStreamBuffer *pBuffer);

    void (STDMETHODCALLTYPE *OnStreamClosed)(
        IRDPSRAPITransportStreamEvents *This,
        HRESULT hrReason);

    END_INTERFACE
} IRDPSRAPITransportStreamEventsVtbl;

interface IRDPSRAPITransportStreamEvents {
    CONST_VTBL IRDPSRAPITransportStreamEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPITransportStreamEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPITransportStreamEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPITransportStreamEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IRDPSRAPITransportStreamEvents methods ***/
#define IRDPSRAPITransportStreamEvents_OnWriteCompleted(This,pBuffer) (This)->lpVtbl->OnWriteCompleted(This,pBuffer)
#define IRDPSRAPITransportStreamEvents_OnReadCompleted(This,pBuffer) (This)->lpVtbl->OnReadCompleted(This,pBuffer)
#define IRDPSRAPITransportStreamEvents_OnStreamClosed(This,hrReason) (This)->lpVtbl->OnStreamClosed(This,hrReason)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPITransportStreamEvents_QueryInterface(IRDPSRAPITransportStreamEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPITransportStreamEvents_AddRef(IRDPSRAPITransportStreamEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPITransportStreamEvents_Release(IRDPSRAPITransportStreamEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IRDPSRAPITransportStreamEvents methods ***/
static FORCEINLINE void IRDPSRAPITransportStreamEvents_OnWriteCompleted(IRDPSRAPITransportStreamEvents* This,IRDPSRAPITransportStreamBuffer *pBuffer) {
    This->lpVtbl->OnWriteCompleted(This,pBuffer);
}
static FORCEINLINE void IRDPSRAPITransportStreamEvents_OnReadCompleted(IRDPSRAPITransportStreamEvents* This,IRDPSRAPITransportStreamBuffer *pBuffer) {
    This->lpVtbl->OnReadCompleted(This,pBuffer);
}
static FORCEINLINE void IRDPSRAPITransportStreamEvents_OnStreamClosed(IRDPSRAPITransportStreamEvents* This,HRESULT hrReason) {
    This->lpVtbl->OnStreamClosed(This,hrReason);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPITransportStreamEvents_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPITransportStream interface
 */
#ifndef __IRDPSRAPITransportStream_INTERFACE_DEFINED__
#define __IRDPSRAPITransportStream_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPITransportStream, 0x36cfa065, 0x43bb, 0x4ef7, 0xae,0xd7, 0x9b,0x88,0xa5,0x05,0x30,0x36);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("36cfa065-43bb-4ef7-aed7-9b88a5053036")
IRDPSRAPITransportStream : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AllocBuffer(
        LONG maxPayload,
        IRDPSRAPITransportStreamBuffer **ppBuffer) = 0;

    virtual HRESULT STDMETHODCALLTYPE FreeBuffer(
        IRDPSRAPITransportStreamBuffer *pBuffer) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteBuffer(
        IRDPSRAPITransportStreamBuffer *pBuffer) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReadBuffer(
        IRDPSRAPITransportStreamBuffer *pBuffer) = 0;

    virtual HRESULT STDMETHODCALLTYPE Open(
        IRDPSRAPITransportStreamEvents *pCallbacks) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPITransportStream, 0x36cfa065, 0x43bb, 0x4ef7, 0xae,0xd7, 0x9b,0x88,0xa5,0x05,0x30,0x36)
#endif
#else
typedef struct IRDPSRAPITransportStreamVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRDPSRAPITransportStream methods ***/
    HRESULT (STDMETHODCALLTYPE *AllocBuffer)(
        IRDPSRAPITransportStream *This,
        LONG maxPayload,
        IRDPSRAPITransportStreamBuffer **ppBuffer);

    HRESULT (STDMETHODCALLTYPE *FreeBuffer)(
        IRDPSRAPITransportStream *This,
        IRDPSRAPITransportStreamBuffer *pBuffer);

    HRESULT (STDMETHODCALLTYPE *WriteBuffer)(
        IRDPSRAPITransportStream *This,
        IRDPSRAPITransportStreamBuffer *pBuffer);

    HRESULT (STDMETHODCALLTYPE *ReadBuffer)(
        IRDPSRAPITransportStream *This,
        IRDPSRAPITransportStreamBuffer *pBuffer);

    HRESULT (STDMETHODCALLTYPE *Open)(
        IRDPSRAPITransportStream *This,
        IRDPSRAPITransportStreamEvents *pCallbacks);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IRDPSRAPITransportStream *This);

    END_INTERFACE
} IRDPSRAPITransportStreamVtbl;

interface IRDPSRAPITransportStream {
    CONST_VTBL IRDPSRAPITransportStreamVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPITransportStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPITransportStream_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPITransportStream_Release(This) (This)->lpVtbl->Release(This)
/*** IRDPSRAPITransportStream methods ***/
#define IRDPSRAPITransportStream_AllocBuffer(This,maxPayload,ppBuffer) (This)->lpVtbl->AllocBuffer(This,maxPayload,ppBuffer)
#define IRDPSRAPITransportStream_FreeBuffer(This,pBuffer) (This)->lpVtbl->FreeBuffer(This,pBuffer)
#define IRDPSRAPITransportStream_WriteBuffer(This,pBuffer) (This)->lpVtbl->WriteBuffer(This,pBuffer)
#define IRDPSRAPITransportStream_ReadBuffer(This,pBuffer) (This)->lpVtbl->ReadBuffer(This,pBuffer)
#define IRDPSRAPITransportStream_Open(This,pCallbacks) (This)->lpVtbl->Open(This,pCallbacks)
#define IRDPSRAPITransportStream_Close(This) (This)->lpVtbl->Close(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPITransportStream_QueryInterface(IRDPSRAPITransportStream* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPITransportStream_AddRef(IRDPSRAPITransportStream* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPITransportStream_Release(IRDPSRAPITransportStream* This) {
    return This->lpVtbl->Release(This);
}
/*** IRDPSRAPITransportStream methods ***/
static FORCEINLINE HRESULT IRDPSRAPITransportStream_AllocBuffer(IRDPSRAPITransportStream* This,LONG maxPayload,IRDPSRAPITransportStreamBuffer **ppBuffer) {
    return This->lpVtbl->AllocBuffer(This,maxPayload,ppBuffer);
}
static FORCEINLINE HRESULT IRDPSRAPITransportStream_FreeBuffer(IRDPSRAPITransportStream* This,IRDPSRAPITransportStreamBuffer *pBuffer) {
    return This->lpVtbl->FreeBuffer(This,pBuffer);
}
static FORCEINLINE HRESULT IRDPSRAPITransportStream_WriteBuffer(IRDPSRAPITransportStream* This,IRDPSRAPITransportStreamBuffer *pBuffer) {
    return This->lpVtbl->WriteBuffer(This,pBuffer);
}
static FORCEINLINE HRESULT IRDPSRAPITransportStream_ReadBuffer(IRDPSRAPITransportStream* This,IRDPSRAPITransportStreamBuffer *pBuffer) {
    return This->lpVtbl->ReadBuffer(This,pBuffer);
}
static FORCEINLINE HRESULT IRDPSRAPITransportStream_Open(IRDPSRAPITransportStream* This,IRDPSRAPITransportStreamEvents *pCallbacks) {
    return This->lpVtbl->Open(This,pCallbacks);
}
static FORCEINLINE HRESULT IRDPSRAPITransportStream_Close(IRDPSRAPITransportStream* This) {
    return This->lpVtbl->Close(This);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPITransportStream_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPISharingSession interface
 */
#ifndef __IRDPSRAPISharingSession_INTERFACE_DEFINED__
#define __IRDPSRAPISharingSession_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPISharingSession, 0xeeb20886, 0xe470, 0x4cf6, 0x84,0x2b, 0x27,0x39,0xc0,0xec,0x5c,0xfb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("eeb20886-e470-4cf6-842b-2739c0ec5cfb")
IRDPSRAPISharingSession : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE Open(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ColorDepth(
        LONG colorDepth) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ColorDepth(
        LONG *pColorDepth) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Properties(
        IRDPSRAPISessionProperties **ppVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Attendees(
        IRDPSRAPIAttendeeManager **ppVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Invitations(
        IRDPSRAPIInvitationManager **ppVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ApplicationFilter(
        IRDPSRAPIApplicationFilter **ppVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_VirtualChannelManager(
        IRDPSRAPIVirtualChannelManager **ppVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE Pause(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resume(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ConnectToClient(
        BSTR bstrConnectionString) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDesktopSharedRect(
        LONG left,
        LONG top,
        LONG right,
        LONG bottom) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDesktopSharedRect(
        LONG *pleft,
        LONG *ptop,
        LONG *pright,
        LONG *pbottom) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPISharingSession, 0xeeb20886, 0xe470, 0x4cf6, 0x84,0x2b, 0x27,0x39,0xc0,0xec,0x5c,0xfb)
#endif
#else
typedef struct IRDPSRAPISharingSessionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPISharingSession *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPISharingSession *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPISharingSession *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPISharingSession *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPISharingSession methods ***/
    HRESULT (STDMETHODCALLTYPE *Open)(
        IRDPSRAPISharingSession *This);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IRDPSRAPISharingSession *This);

    HRESULT (STDMETHODCALLTYPE *put_ColorDepth)(
        IRDPSRAPISharingSession *This,
        LONG colorDepth);

    HRESULT (STDMETHODCALLTYPE *get_ColorDepth)(
        IRDPSRAPISharingSession *This,
        LONG *pColorDepth);

    HRESULT (STDMETHODCALLTYPE *get_Properties)(
        IRDPSRAPISharingSession *This,
        IRDPSRAPISessionProperties **ppVal);

    HRESULT (STDMETHODCALLTYPE *get_Attendees)(
        IRDPSRAPISharingSession *This,
        IRDPSRAPIAttendeeManager **ppVal);

    HRESULT (STDMETHODCALLTYPE *get_Invitations)(
        IRDPSRAPISharingSession *This,
        IRDPSRAPIInvitationManager **ppVal);

    HRESULT (STDMETHODCALLTYPE *get_ApplicationFilter)(
        IRDPSRAPISharingSession *This,
        IRDPSRAPIApplicationFilter **ppVal);

    HRESULT (STDMETHODCALLTYPE *get_VirtualChannelManager)(
        IRDPSRAPISharingSession *This,
        IRDPSRAPIVirtualChannelManager **ppVal);

    HRESULT (STDMETHODCALLTYPE *Pause)(
        IRDPSRAPISharingSession *This);

    HRESULT (STDMETHODCALLTYPE *Resume)(
        IRDPSRAPISharingSession *This);

    HRESULT (STDMETHODCALLTYPE *ConnectToClient)(
        IRDPSRAPISharingSession *This,
        BSTR bstrConnectionString);

    HRESULT (STDMETHODCALLTYPE *SetDesktopSharedRect)(
        IRDPSRAPISharingSession *This,
        LONG left,
        LONG top,
        LONG right,
        LONG bottom);

    HRESULT (STDMETHODCALLTYPE *GetDesktopSharedRect)(
        IRDPSRAPISharingSession *This,
        LONG *pleft,
        LONG *ptop,
        LONG *pright,
        LONG *pbottom);

    END_INTERFACE
} IRDPSRAPISharingSessionVtbl;

interface IRDPSRAPISharingSession {
    CONST_VTBL IRDPSRAPISharingSessionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPISharingSession_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPISharingSession_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPISharingSession_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPISharingSession_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPISharingSession_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPISharingSession_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPISharingSession_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPISharingSession methods ***/
#define IRDPSRAPISharingSession_Open(This) (This)->lpVtbl->Open(This)
#define IRDPSRAPISharingSession_Close(This) (This)->lpVtbl->Close(This)
#define IRDPSRAPISharingSession_put_ColorDepth(This,colorDepth) (This)->lpVtbl->put_ColorDepth(This,colorDepth)
#define IRDPSRAPISharingSession_get_ColorDepth(This,pColorDepth) (This)->lpVtbl->get_ColorDepth(This,pColorDepth)
#define IRDPSRAPISharingSession_get_Properties(This,ppVal) (This)->lpVtbl->get_Properties(This,ppVal)
#define IRDPSRAPISharingSession_get_Attendees(This,ppVal) (This)->lpVtbl->get_Attendees(This,ppVal)
#define IRDPSRAPISharingSession_get_Invitations(This,ppVal) (This)->lpVtbl->get_Invitations(This,ppVal)
#define IRDPSRAPISharingSession_get_ApplicationFilter(This,ppVal) (This)->lpVtbl->get_ApplicationFilter(This,ppVal)
#define IRDPSRAPISharingSession_get_VirtualChannelManager(This,ppVal) (This)->lpVtbl->get_VirtualChannelManager(This,ppVal)
#define IRDPSRAPISharingSession_Pause(This) (This)->lpVtbl->Pause(This)
#define IRDPSRAPISharingSession_Resume(This) (This)->lpVtbl->Resume(This)
#define IRDPSRAPISharingSession_ConnectToClient(This,bstrConnectionString) (This)->lpVtbl->ConnectToClient(This,bstrConnectionString)
#define IRDPSRAPISharingSession_SetDesktopSharedRect(This,left,top,right,bottom) (This)->lpVtbl->SetDesktopSharedRect(This,left,top,right,bottom)
#define IRDPSRAPISharingSession_GetDesktopSharedRect(This,pleft,ptop,pright,pbottom) (This)->lpVtbl->GetDesktopSharedRect(This,pleft,ptop,pright,pbottom)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPISharingSession_QueryInterface(IRDPSRAPISharingSession* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPISharingSession_AddRef(IRDPSRAPISharingSession* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPISharingSession_Release(IRDPSRAPISharingSession* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPISharingSession_GetTypeInfoCount(IRDPSRAPISharingSession* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession_GetTypeInfo(IRDPSRAPISharingSession* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession_GetIDsOfNames(IRDPSRAPISharingSession* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession_Invoke(IRDPSRAPISharingSession* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPISharingSession methods ***/
static FORCEINLINE HRESULT IRDPSRAPISharingSession_Open(IRDPSRAPISharingSession* This) {
    return This->lpVtbl->Open(This);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession_Close(IRDPSRAPISharingSession* This) {
    return This->lpVtbl->Close(This);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession_put_ColorDepth(IRDPSRAPISharingSession* This,LONG colorDepth) {
    return This->lpVtbl->put_ColorDepth(This,colorDepth);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession_get_ColorDepth(IRDPSRAPISharingSession* This,LONG *pColorDepth) {
    return This->lpVtbl->get_ColorDepth(This,pColorDepth);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession_get_Properties(IRDPSRAPISharingSession* This,IRDPSRAPISessionProperties **ppVal) {
    return This->lpVtbl->get_Properties(This,ppVal);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession_get_Attendees(IRDPSRAPISharingSession* This,IRDPSRAPIAttendeeManager **ppVal) {
    return This->lpVtbl->get_Attendees(This,ppVal);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession_get_Invitations(IRDPSRAPISharingSession* This,IRDPSRAPIInvitationManager **ppVal) {
    return This->lpVtbl->get_Invitations(This,ppVal);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession_get_ApplicationFilter(IRDPSRAPISharingSession* This,IRDPSRAPIApplicationFilter **ppVal) {
    return This->lpVtbl->get_ApplicationFilter(This,ppVal);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession_get_VirtualChannelManager(IRDPSRAPISharingSession* This,IRDPSRAPIVirtualChannelManager **ppVal) {
    return This->lpVtbl->get_VirtualChannelManager(This,ppVal);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession_Pause(IRDPSRAPISharingSession* This) {
    return This->lpVtbl->Pause(This);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession_Resume(IRDPSRAPISharingSession* This) {
    return This->lpVtbl->Resume(This);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession_ConnectToClient(IRDPSRAPISharingSession* This,BSTR bstrConnectionString) {
    return This->lpVtbl->ConnectToClient(This,bstrConnectionString);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession_SetDesktopSharedRect(IRDPSRAPISharingSession* This,LONG left,LONG top,LONG right,LONG bottom) {
    return This->lpVtbl->SetDesktopSharedRect(This,left,top,right,bottom);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession_GetDesktopSharedRect(IRDPSRAPISharingSession* This,LONG *pleft,LONG *ptop,LONG *pright,LONG *pbottom) {
    return This->lpVtbl->GetDesktopSharedRect(This,pleft,ptop,pright,pbottom);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPISharingSession_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRDPSRAPISharingSession2 interface
 */
#ifndef __IRDPSRAPISharingSession2_INTERFACE_DEFINED__
#define __IRDPSRAPISharingSession2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRDPSRAPISharingSession2, 0xfee4ee57, 0xe3e8, 0x4205, 0x8f,0xb0, 0x8f,0xd1,0xd0,0x67,0x5c,0x21);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fee4ee57-e3e8-4205-8fb0-8fd1d0675c21")
IRDPSRAPISharingSession2 : public IRDPSRAPISharingSession
{
    virtual HRESULT STDMETHODCALLTYPE ConnectUsingTransportStream(
        IRDPSRAPITransportStream *pStream,
        BSTR bstrGroup,
        BSTR bstrAuthenticatedAttendeeName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FrameBuffer(
        IRDPSRAPIFrameBuffer **ppVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE SendControlLevelChangeResponse(
        IRDPSRAPIAttendee *pAttendee,
        CTRL_LEVEL RequestedLevel,
        LONG ReasonCode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRDPSRAPISharingSession2, 0xfee4ee57, 0xe3e8, 0x4205, 0x8f,0xb0, 0x8f,0xd1,0xd0,0x67,0x5c,0x21)
#endif
#else
typedef struct IRDPSRAPISharingSession2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRDPSRAPISharingSession2 *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRDPSRAPISharingSession2 *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRDPSRAPISharingSession2 *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRDPSRAPISharingSession2 *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRDPSRAPISharingSession methods ***/
    HRESULT (STDMETHODCALLTYPE *Open)(
        IRDPSRAPISharingSession2 *This);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IRDPSRAPISharingSession2 *This);

    HRESULT (STDMETHODCALLTYPE *put_ColorDepth)(
        IRDPSRAPISharingSession2 *This,
        LONG colorDepth);

    HRESULT (STDMETHODCALLTYPE *get_ColorDepth)(
        IRDPSRAPISharingSession2 *This,
        LONG *pColorDepth);

    HRESULT (STDMETHODCALLTYPE *get_Properties)(
        IRDPSRAPISharingSession2 *This,
        IRDPSRAPISessionProperties **ppVal);

    HRESULT (STDMETHODCALLTYPE *get_Attendees)(
        IRDPSRAPISharingSession2 *This,
        IRDPSRAPIAttendeeManager **ppVal);

    HRESULT (STDMETHODCALLTYPE *get_Invitations)(
        IRDPSRAPISharingSession2 *This,
        IRDPSRAPIInvitationManager **ppVal);

    HRESULT (STDMETHODCALLTYPE *get_ApplicationFilter)(
        IRDPSRAPISharingSession2 *This,
        IRDPSRAPIApplicationFilter **ppVal);

    HRESULT (STDMETHODCALLTYPE *get_VirtualChannelManager)(
        IRDPSRAPISharingSession2 *This,
        IRDPSRAPIVirtualChannelManager **ppVal);

    HRESULT (STDMETHODCALLTYPE *Pause)(
        IRDPSRAPISharingSession2 *This);

    HRESULT (STDMETHODCALLTYPE *Resume)(
        IRDPSRAPISharingSession2 *This);

    HRESULT (STDMETHODCALLTYPE *ConnectToClient)(
        IRDPSRAPISharingSession2 *This,
        BSTR bstrConnectionString);

    HRESULT (STDMETHODCALLTYPE *SetDesktopSharedRect)(
        IRDPSRAPISharingSession2 *This,
        LONG left,
        LONG top,
        LONG right,
        LONG bottom);

    HRESULT (STDMETHODCALLTYPE *GetDesktopSharedRect)(
        IRDPSRAPISharingSession2 *This,
        LONG *pleft,
        LONG *ptop,
        LONG *pright,
        LONG *pbottom);

    /*** IRDPSRAPISharingSession2 methods ***/
    HRESULT (STDMETHODCALLTYPE *ConnectUsingTransportStream)(
        IRDPSRAPISharingSession2 *This,
        IRDPSRAPITransportStream *pStream,
        BSTR bstrGroup,
        BSTR bstrAuthenticatedAttendeeName);

    HRESULT (STDMETHODCALLTYPE *get_FrameBuffer)(
        IRDPSRAPISharingSession2 *This,
        IRDPSRAPIFrameBuffer **ppVal);

    HRESULT (STDMETHODCALLTYPE *SendControlLevelChangeResponse)(
        IRDPSRAPISharingSession2 *This,
        IRDPSRAPIAttendee *pAttendee,
        CTRL_LEVEL RequestedLevel,
        LONG ReasonCode);

    END_INTERFACE
} IRDPSRAPISharingSession2Vtbl;

interface IRDPSRAPISharingSession2 {
    CONST_VTBL IRDPSRAPISharingSession2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRDPSRAPISharingSession2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRDPSRAPISharingSession2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRDPSRAPISharingSession2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRDPSRAPISharingSession2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRDPSRAPISharingSession2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRDPSRAPISharingSession2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRDPSRAPISharingSession2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRDPSRAPISharingSession methods ***/
#define IRDPSRAPISharingSession2_Open(This) (This)->lpVtbl->Open(This)
#define IRDPSRAPISharingSession2_Close(This) (This)->lpVtbl->Close(This)
#define IRDPSRAPISharingSession2_put_ColorDepth(This,colorDepth) (This)->lpVtbl->put_ColorDepth(This,colorDepth)
#define IRDPSRAPISharingSession2_get_ColorDepth(This,pColorDepth) (This)->lpVtbl->get_ColorDepth(This,pColorDepth)
#define IRDPSRAPISharingSession2_get_Properties(This,ppVal) (This)->lpVtbl->get_Properties(This,ppVal)
#define IRDPSRAPISharingSession2_get_Attendees(This,ppVal) (This)->lpVtbl->get_Attendees(This,ppVal)
#define IRDPSRAPISharingSession2_get_Invitations(This,ppVal) (This)->lpVtbl->get_Invitations(This,ppVal)
#define IRDPSRAPISharingSession2_get_ApplicationFilter(This,ppVal) (This)->lpVtbl->get_ApplicationFilter(This,ppVal)
#define IRDPSRAPISharingSession2_get_VirtualChannelManager(This,ppVal) (This)->lpVtbl->get_VirtualChannelManager(This,ppVal)
#define IRDPSRAPISharingSession2_Pause(This) (This)->lpVtbl->Pause(This)
#define IRDPSRAPISharingSession2_Resume(This) (This)->lpVtbl->Resume(This)
#define IRDPSRAPISharingSession2_ConnectToClient(This,bstrConnectionString) (This)->lpVtbl->ConnectToClient(This,bstrConnectionString)
#define IRDPSRAPISharingSession2_SetDesktopSharedRect(This,left,top,right,bottom) (This)->lpVtbl->SetDesktopSharedRect(This,left,top,right,bottom)
#define IRDPSRAPISharingSession2_GetDesktopSharedRect(This,pleft,ptop,pright,pbottom) (This)->lpVtbl->GetDesktopSharedRect(This,pleft,ptop,pright,pbottom)
/*** IRDPSRAPISharingSession2 methods ***/
#define IRDPSRAPISharingSession2_ConnectUsingTransportStream(This,pStream,bstrGroup,bstrAuthenticatedAttendeeName) (This)->lpVtbl->ConnectUsingTransportStream(This,pStream,bstrGroup,bstrAuthenticatedAttendeeName)
#define IRDPSRAPISharingSession2_get_FrameBuffer(This,ppVal) (This)->lpVtbl->get_FrameBuffer(This,ppVal)
#define IRDPSRAPISharingSession2_SendControlLevelChangeResponse(This,pAttendee,RequestedLevel,ReasonCode) (This)->lpVtbl->SendControlLevelChangeResponse(This,pAttendee,RequestedLevel,ReasonCode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_QueryInterface(IRDPSRAPISharingSession2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRDPSRAPISharingSession2_AddRef(IRDPSRAPISharingSession2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRDPSRAPISharingSession2_Release(IRDPSRAPISharingSession2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_GetTypeInfoCount(IRDPSRAPISharingSession2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_GetTypeInfo(IRDPSRAPISharingSession2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_GetIDsOfNames(IRDPSRAPISharingSession2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_Invoke(IRDPSRAPISharingSession2* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRDPSRAPISharingSession methods ***/
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_Open(IRDPSRAPISharingSession2* This) {
    return This->lpVtbl->Open(This);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_Close(IRDPSRAPISharingSession2* This) {
    return This->lpVtbl->Close(This);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_put_ColorDepth(IRDPSRAPISharingSession2* This,LONG colorDepth) {
    return This->lpVtbl->put_ColorDepth(This,colorDepth);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_get_ColorDepth(IRDPSRAPISharingSession2* This,LONG *pColorDepth) {
    return This->lpVtbl->get_ColorDepth(This,pColorDepth);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_get_Properties(IRDPSRAPISharingSession2* This,IRDPSRAPISessionProperties **ppVal) {
    return This->lpVtbl->get_Properties(This,ppVal);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_get_Attendees(IRDPSRAPISharingSession2* This,IRDPSRAPIAttendeeManager **ppVal) {
    return This->lpVtbl->get_Attendees(This,ppVal);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_get_Invitations(IRDPSRAPISharingSession2* This,IRDPSRAPIInvitationManager **ppVal) {
    return This->lpVtbl->get_Invitations(This,ppVal);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_get_ApplicationFilter(IRDPSRAPISharingSession2* This,IRDPSRAPIApplicationFilter **ppVal) {
    return This->lpVtbl->get_ApplicationFilter(This,ppVal);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_get_VirtualChannelManager(IRDPSRAPISharingSession2* This,IRDPSRAPIVirtualChannelManager **ppVal) {
    return This->lpVtbl->get_VirtualChannelManager(This,ppVal);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_Pause(IRDPSRAPISharingSession2* This) {
    return This->lpVtbl->Pause(This);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_Resume(IRDPSRAPISharingSession2* This) {
    return This->lpVtbl->Resume(This);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_ConnectToClient(IRDPSRAPISharingSession2* This,BSTR bstrConnectionString) {
    return This->lpVtbl->ConnectToClient(This,bstrConnectionString);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_SetDesktopSharedRect(IRDPSRAPISharingSession2* This,LONG left,LONG top,LONG right,LONG bottom) {
    return This->lpVtbl->SetDesktopSharedRect(This,left,top,right,bottom);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_GetDesktopSharedRect(IRDPSRAPISharingSession2* This,LONG *pleft,LONG *ptop,LONG *pright,LONG *pbottom) {
    return This->lpVtbl->GetDesktopSharedRect(This,pleft,ptop,pright,pbottom);
}
/*** IRDPSRAPISharingSession2 methods ***/
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_ConnectUsingTransportStream(IRDPSRAPISharingSession2* This,IRDPSRAPITransportStream *pStream,BSTR bstrGroup,BSTR bstrAuthenticatedAttendeeName) {
    return This->lpVtbl->ConnectUsingTransportStream(This,pStream,bstrGroup,bstrAuthenticatedAttendeeName);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_get_FrameBuffer(IRDPSRAPISharingSession2* This,IRDPSRAPIFrameBuffer **ppVal) {
    return This->lpVtbl->get_FrameBuffer(This,ppVal);
}
static FORCEINLINE HRESULT IRDPSRAPISharingSession2_SendControlLevelChangeResponse(IRDPSRAPISharingSession2* This,IRDPSRAPIAttendee *pAttendee,CTRL_LEVEL RequestedLevel,LONG ReasonCode) {
    return This->lpVtbl->SendControlLevelChangeResponse(This,pAttendee,RequestedLevel,ReasonCode);
}
#endif
#endif

#endif


#endif  /* __IRDPSRAPISharingSession2_INTERFACE_DEFINED__ */

#ifndef __RDPCOMAPILib_LIBRARY_DEFINED__
#define __RDPCOMAPILib_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_RDPCOMAPILib, 0xcc802d05, 0xae07, 0x4c15, 0xb4,0x96, 0xdb,0x9d,0x22,0xaa,0x0a,0x84);

typedef enum __WIDL_rdpencomapi_generated_name_0000002B {
    CONST_MAX_CHANNEL_MESSAGE_SIZE = 1024,
    CONST_MAX_CHANNEL_NAME_LEN = 8,
    CONST_MAX_LEGACY_CHANNEL_MESSAGE_SIZE = 409600,
    CONST_ATTENDEE_ID_EVERYONE = -1,
    CONST_ATTENDEE_ID_HOST = 0,
    CONST_CONN_INTERVAL = 50,
    CONST_ATTENDEE_ID_DEFAULT = 0xffffffff
} RDPENCOMAPI_CONSTANTS;
/*****************************************************************************
 * _IRDPSessionEvents dispinterface
 */
#ifndef ___IRDPSessionEvents_DISPINTERFACE_DEFINED__
#define ___IRDPSessionEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID__IRDPSessionEvents, 0x98a97042, 0x6698, 0x40e9, 0x8e,0xfd, 0xb3,0x20,0x09,0x90,0x00,0x4b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("98a97042-6698-40e9-8efd-b3200990004b")
_IRDPSessionEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(_IRDPSessionEvents, 0x98a97042, 0x6698, 0x40e9, 0x8e,0xfd, 0xb3,0x20,0x09,0x90,0x00,0x4b)
#endif
#else
typedef struct _IRDPSessionEventsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        _IRDPSessionEvents *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        _IRDPSessionEvents *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        _IRDPSessionEvents *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        _IRDPSessionEvents *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} _IRDPSessionEventsVtbl;

interface _IRDPSessionEvents {
    CONST_VTBL _IRDPSessionEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define _IRDPSessionEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define _IRDPSessionEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define _IRDPSessionEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define _IRDPSessionEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define _IRDPSessionEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define _IRDPSessionEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define _IRDPSessionEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT _IRDPSessionEvents_QueryInterface(_IRDPSessionEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG _IRDPSessionEvents_AddRef(_IRDPSessionEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG _IRDPSessionEvents_Release(_IRDPSessionEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT _IRDPSessionEvents_GetTypeInfoCount(_IRDPSessionEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT _IRDPSessionEvents_GetTypeInfo(_IRDPSessionEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT _IRDPSessionEvents_GetIDsOfNames(_IRDPSessionEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT _IRDPSessionEvents_Invoke(_IRDPSessionEvents* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
#endif
#endif

#endif

#endif  /* ___IRDPSessionEvents_DISPINTERFACE_DEFINED__ */

typedef struct __ReferenceRemainingTypes__ {
    CTRL_LEVEL __ctrlLevel__;
    ATTENDEE_DISCONNECT_REASON __attendeeDisconnectReason__;
    CHANNEL_PRIORITY __channelPriority__;
    CHANNEL_FLAGS __channelFlags__;
    CHANNEL_ACCESS_ENUM __channelAccessEnum__;
    RDPENCOMAPI_ATTENDEE_FLAGS __rdpencomapiAttendeeFlags__;
    RDPSRAPI_WND_FLAGS __rdpsrapiWndFlags__;
    RDPSRAPI_APP_FLAGS __rdpsrapiAppFlags__;
} __ReferenceRemainingTypes__;
#ifndef __IRDPViewerRenderingSurface_FWD_DEFINED__
#define __IRDPViewerRenderingSurface_FWD_DEFINED__
typedef interface IRDPViewerRenderingSurface IRDPViewerRenderingSurface;
#ifdef __cplusplus
interface IRDPViewerRenderingSurface;
#endif /* __cplusplus */
#endif

#ifndef __IRDPViewerInputSink_FWD_DEFINED__
#define __IRDPViewerInputSink_FWD_DEFINED__
typedef interface IRDPViewerInputSink IRDPViewerInputSink;
#ifdef __cplusplus
interface IRDPViewerInputSink;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIAudioStream_FWD_DEFINED__
#define __IRDPSRAPIAudioStream_FWD_DEFINED__
typedef interface IRDPSRAPIAudioStream IRDPSRAPIAudioStream;
#ifdef __cplusplus
interface IRDPSRAPIAudioStream;
#endif /* __cplusplus */
#endif

#ifndef __IRDPSRAPIPerfCounterLoggingManager_FWD_DEFINED__
#define __IRDPSRAPIPerfCounterLoggingManager_FWD_DEFINED__
typedef interface IRDPSRAPIPerfCounterLoggingManager IRDPSRAPIPerfCounterLoggingManager;
#ifdef __cplusplus
interface IRDPSRAPIPerfCounterLoggingManager;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * RDPViewer coclass
 */

DEFINE_GUID(CLSID_RDPViewer, 0x32be5ed2, 0x5c86, 0x480f, 0xa9,0x14, 0x0f,0xf8,0x88,0x5a,0x1b,0x3f);

#ifdef __cplusplus
class DECLSPEC_UUID("32be5ed2-5c86-480f-a914-0ff8885a1b3f") RDPViewer;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RDPViewer, 0x32be5ed2, 0x5c86, 0x480f, 0xa9,0x14, 0x0f,0xf8,0x88,0x5a,0x1b,0x3f)
#endif
#endif

/*****************************************************************************
 * RDPSRAPISessionProperties coclass
 */

DEFINE_GUID(CLSID_RDPSRAPISessionProperties, 0xdd7594ff, 0xea2a, 0x4c06, 0x8f,0xdf, 0x13,0x2d,0xe4,0x8b,0x65,0x10);

#ifdef __cplusplus
class DECLSPEC_UUID("dd7594ff-ea2a-4c06-8fdf-132de48b6510") RDPSRAPISessionProperties;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RDPSRAPISessionProperties, 0xdd7594ff, 0xea2a, 0x4c06, 0x8f,0xdf, 0x13,0x2d,0xe4,0x8b,0x65,0x10)
#endif
#endif

/*****************************************************************************
 * RDPSRAPIInvitationManager coclass
 */

DEFINE_GUID(CLSID_RDPSRAPIInvitationManager, 0x53d9c9db, 0x75ab, 0x4271, 0x94,0x8a, 0x4c,0x4e,0xb3,0x6a,0x8f,0x2b);

#ifdef __cplusplus
class DECLSPEC_UUID("53d9c9db-75ab-4271-948a-4c4eb36a8f2b") RDPSRAPIInvitationManager;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RDPSRAPIInvitationManager, 0x53d9c9db, 0x75ab, 0x4271, 0x94,0x8a, 0x4c,0x4e,0xb3,0x6a,0x8f,0x2b)
#endif
#endif

/*****************************************************************************
 * RDPSRAPIInvitation coclass
 */

DEFINE_GUID(CLSID_RDPSRAPIInvitation, 0x49174dc6, 0x0731, 0x4b5e, 0x8e,0xe1, 0x83,0xa6,0x3d,0x38,0x68,0xfa);

#ifdef __cplusplus
class DECLSPEC_UUID("49174dc6-0731-4b5e-8ee1-83a63d3868fa") RDPSRAPIInvitation;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RDPSRAPIInvitation, 0x49174dc6, 0x0731, 0x4b5e, 0x8e,0xe1, 0x83,0xa6,0x3d,0x38,0x68,0xfa)
#endif
#endif

/*****************************************************************************
 * RDPSRAPIAttendeeManager coclass
 */

DEFINE_GUID(CLSID_RDPSRAPIAttendeeManager, 0xd7b13a01, 0xf7d4, 0x42a6, 0x85,0x95, 0x12,0xfc,0x8c,0x24,0xe8,0x51);

#ifdef __cplusplus
class DECLSPEC_UUID("d7b13a01-f7d4-42a6-8595-12fc8c24e851") RDPSRAPIAttendeeManager;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RDPSRAPIAttendeeManager, 0xd7b13a01, 0xf7d4, 0x42a6, 0x85,0x95, 0x12,0xfc,0x8c,0x24,0xe8,0x51)
#endif
#endif

/*****************************************************************************
 * RDPSRAPIAttendee coclass
 */

DEFINE_GUID(CLSID_RDPSRAPIAttendee, 0x74f93bb5, 0x755f, 0x488e, 0x8a,0x29, 0x23,0x90,0x10,0x8a,0xef,0x55);

#ifdef __cplusplus
class DECLSPEC_UUID("74f93bb5-755f-488e-8a29-2390108aef55") RDPSRAPIAttendee;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RDPSRAPIAttendee, 0x74f93bb5, 0x755f, 0x488e, 0x8a,0x29, 0x23,0x90,0x10,0x8a,0xef,0x55)
#endif
#endif

/*****************************************************************************
 * RDPSRAPIAttendeeDisconnectInfo coclass
 */

DEFINE_GUID(CLSID_RDPSRAPIAttendeeDisconnectInfo, 0xb47d7250, 0x5bdb, 0x405d, 0xb4,0x87, 0xca,0xad,0x9c,0x56,0xf4,0xf8);

#ifdef __cplusplus
class DECLSPEC_UUID("b47d7250-5bdb-405d-b487-caad9c56f4f8") RDPSRAPIAttendeeDisconnectInfo;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RDPSRAPIAttendeeDisconnectInfo, 0xb47d7250, 0x5bdb, 0x405d, 0xb4,0x87, 0xca,0xad,0x9c,0x56,0xf4,0xf8)
#endif
#endif

/*****************************************************************************
 * RDPSRAPIApplicationFilter coclass
 */

DEFINE_GUID(CLSID_RDPSRAPIApplicationFilter, 0xe35ace89, 0xc7e8, 0x427e, 0xa4,0xf9, 0xb9,0xda,0x07,0x28,0x26,0xbd);

#ifdef __cplusplus
class DECLSPEC_UUID("e35ace89-c7e8-427e-a4f9-b9da072826bd") RDPSRAPIApplicationFilter;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RDPSRAPIApplicationFilter, 0xe35ace89, 0xc7e8, 0x427e, 0xa4,0xf9, 0xb9,0xda,0x07,0x28,0x26,0xbd)
#endif
#endif

/*****************************************************************************
 * RDPSRAPIApplicationList coclass
 */

DEFINE_GUID(CLSID_RDPSRAPIApplicationList, 0x9e31c815, 0x7433, 0x4876, 0x97,0xfb, 0xed,0x59,0xfe,0x2b,0xaa,0x22);

#ifdef __cplusplus
class DECLSPEC_UUID("9e31c815-7433-4876-97fb-ed59fe2baa22") RDPSRAPIApplicationList;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RDPSRAPIApplicationList, 0x9e31c815, 0x7433, 0x4876, 0x97,0xfb, 0xed,0x59,0xfe,0x2b,0xaa,0x22)
#endif
#endif

/*****************************************************************************
 * RDPSRAPIApplication coclass
 */

DEFINE_GUID(CLSID_RDPSRAPIApplication, 0xc116a484, 0x4b25, 0x4b9f, 0x8a,0x54, 0xb9,0x34,0xb0,0x6e,0x57,0xfa);

#ifdef __cplusplus
class DECLSPEC_UUID("c116a484-4b25-4b9f-8a54-b934b06e57fa") RDPSRAPIApplication;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RDPSRAPIApplication, 0xc116a484, 0x4b25, 0x4b9f, 0x8a,0x54, 0xb9,0x34,0xb0,0x6e,0x57,0xfa)
#endif
#endif

/*****************************************************************************
 * RDPSRAPIWindowList coclass
 */

DEFINE_GUID(CLSID_RDPSRAPIWindowList, 0x9c21e2b8, 0x5dd4, 0x42cc, 0x81,0xba, 0x1c,0x09,0x98,0x52,0xe6,0xfa);

#ifdef __cplusplus
class DECLSPEC_UUID("9c21e2b8-5dd4-42cc-81ba-1c099852e6fa") RDPSRAPIWindowList;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RDPSRAPIWindowList, 0x9c21e2b8, 0x5dd4, 0x42cc, 0x81,0xba, 0x1c,0x09,0x98,0x52,0xe6,0xfa)
#endif
#endif

/*****************************************************************************
 * RDPSRAPIWindow coclass
 */

DEFINE_GUID(CLSID_RDPSRAPIWindow, 0x03cf46db, 0xce45, 0x4d36, 0x86,0xed, 0xed,0x28,0xb7,0x43,0x98,0xbf);

#ifdef __cplusplus
class DECLSPEC_UUID("03cf46db-ce45-4d36-86ed-ed28b74398bf") RDPSRAPIWindow;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RDPSRAPIWindow, 0x03cf46db, 0xce45, 0x4d36, 0x86,0xed, 0xed,0x28,0xb7,0x43,0x98,0xbf)
#endif
#endif

/*****************************************************************************
 * RDPSRAPITcpConnectionInfo coclass
 */

DEFINE_GUID(CLSID_RDPSRAPITcpConnectionInfo, 0xbe49db3f, 0xebb6, 0x4278, 0x8c,0xe0, 0xd5,0x45,0x58,0x33,0xea,0xee);

#ifdef __cplusplus
class DECLSPEC_UUID("be49db3f-ebb6-4278-8ce0-d5455833eaee") RDPSRAPITcpConnectionInfo;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RDPSRAPITcpConnectionInfo, 0xbe49db3f, 0xebb6, 0x4278, 0x8c,0xe0, 0xd5,0x45,0x58,0x33,0xea,0xee)
#endif
#endif

/*****************************************************************************
 * RDPSession coclass
 */

DEFINE_GUID(CLSID_RDPSession, 0x9b78f0e6, 0x3e05, 0x4a5b, 0xb2,0xe8, 0xe7,0x43,0xa8,0x95,0x6b,0x65);

#ifdef __cplusplus
class DECLSPEC_UUID("9b78f0e6-3e05-4a5b-b2e8-e743a8956b65") RDPSession;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RDPSession, 0x9b78f0e6, 0x3e05, 0x4a5b, 0xb2,0xe8, 0xe7,0x43,0xa8,0x95,0x6b,0x65)
#endif
#endif

/*****************************************************************************
 * RDPSRAPIFrameBuffer coclass
 */

DEFINE_GUID(CLSID_RDPSRAPIFrameBuffer, 0xa4f66bcc, 0x538e, 0x4101, 0x95,0x1d, 0x30,0x84,0x7a,0xdb,0x51,0x01);

#ifdef __cplusplus
class DECLSPEC_UUID("a4f66bcc-538e-4101-951d-30847adb5101") RDPSRAPIFrameBuffer;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RDPSRAPIFrameBuffer, 0xa4f66bcc, 0x538e, 0x4101, 0x95,0x1d, 0x30,0x84,0x7a,0xdb,0x51,0x01)
#endif
#endif

/*****************************************************************************
 * RDPTransportStreamBuffer coclass
 */

DEFINE_GUID(CLSID_RDPTransportStreamBuffer, 0x8d4a1c69, 0xf17f, 0x4549, 0xa6,0x99, 0x76,0x1c,0x6e,0x6b,0x5c,0x0a);

#ifdef __cplusplus
class DECLSPEC_UUID("8d4a1c69-f17f-4549-a699-761c6e6b5c0a") RDPTransportStreamBuffer;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RDPTransportStreamBuffer, 0x8d4a1c69, 0xf17f, 0x4549, 0xa6,0x99, 0x76,0x1c,0x6e,0x6b,0x5c,0x0a)
#endif
#endif

/*****************************************************************************
 * RDPTransportStreamEvents coclass
 */

DEFINE_GUID(CLSID_RDPTransportStreamEvents, 0x31e3ab20, 0x5350, 0x483f, 0x9d,0xc6, 0x67,0x48,0x66,0x5e,0xfd,0xeb);

#ifdef __cplusplus
class DECLSPEC_UUID("31e3ab20-5350-483f-9dc6-6748665efdeb") RDPTransportStreamEvents;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RDPTransportStreamEvents, 0x31e3ab20, 0x5350, 0x483f, 0x9d,0xc6, 0x67,0x48,0x66,0x5e,0xfd,0xeb)
#endif
#endif

#endif /* __RDPCOMAPILib_LIBRARY_DEFINED__ */
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);
ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __rdpencomapi_h__ */
