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